медленное отображение файлов и размеров - PullRequest
3 голосов
/ 06 февраля 2020

эта команда для получения всех файлов и размеров

find . -type f | xargs -I x du -s x > /tmp/asd

примерно в 1000 раз медленнее, чем этот python скрипт

import os
for dirpath, dirnames, filenames in os.walk("."):
    for f in filenames:
        print(f)
        fp = os.path.join(dirpath, f)
        if os.path.isfile(fp):
            print(os.path.getsize(fp))

Я что-то не так делаю в скрипте bash ?
Структура каталогов имеет что-то вроде 5 миллионов файлов

Ответы [ 2 ]

4 голосов
/ 07 февраля 2020

find имеет опцию -printf для отображения некоторых данных о найденных файлах:

%p     File's name.
%s     File's size in bytes.
%u     File's user name, or numeric user ID if the user has no name.
%g     File's group name, or numeric group ID if the group has no name.
...

Итак, немного дальше, чем отличное решение @Aaron, вы Вы можете получить необходимую информацию напрямую, без запуска какого-либо другого процесса через xargs или -exec:

find . -type f -printf '%p %s\n'
2 голосов
/ 06 февраля 2020

Я бы предложил использовать следующее:

find . -type f -exec stat --printf='%n %s\n' {} +

Основное повышение производительности происходит за счет отказа от запуска нового процесса для каждого файла, соответствующего find. Это можно было бы сделать с помощью xargs, но, поскольку find вполне способен выполнять команды на основе файлов, которые ему соответствуют, мы могли бы также удалить еще один процесс.
С find это делается с помощью -exec ... + (а не -exec ... \;), который будет порождать как можно меньше процессов (на основе максимального количества аргументов, поддерживаемых вашей ОС).

Более того, мы используем более базовый c stat, а не du для запроса размера файла, который ближе к тому, что вы сделали в вашем скрипте python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...