Как отобразить “читаемые человеком” размеры файлов в результатах find?

Вопрос или проблема

Я пытаюсь найти все крупные файлы на своем сервере Centos. Для этого я использую:

find / -maxdepth 10 -size +100000 -ls

Я пытался изменить -ls на -lsh, но это не разрешено.

Как я могу отобразить эти результаты с понятными размерами (используя суффиксы k, M, …)?

find не имеет сложных опций, как ls. Если вам нужен ls -h, вам нужно вызвать ls.

find / -maxdepth 10 -size +100000 -exec ls -lh {} +

Я рекомендую использовать опцию -xdev, чтобы избежать рекурсивного поиска по другим файловым системам, что будет бесполезно, если вас беспокоит место на диске.

find / -xdev -maxdepth 10 -size +100000 -exec ls -lh {} +

Если вы используете zsh в качестве оболочки, то вместо использования find можете использовать квалификаторы glob. Ограничить размер файла просто: L, за которым следует размер; размер может иметь необязательную единицу перед числом. Если вам не важна максимальная глубина, вы можете использовать **/ для рекурсии по подкаталогам. Если вам важна максимальная глубина, это более сложно, так как шаблоны glob в zsh не имеют способа выразить “не более n вхождений”. Чтобы избежать рекурсии по файловым системам, используйте квалификатор d; вам нужно узнать номер устройства, который можно отобразить с помощью команды stat в Linux (stat -c %d / для отображения только номера) или с помощью встроенной команды stat в zsh (выполните zmodload zsh/stat, чтобы загрузить ее).

ls -lh /**/*(L+M99d$(stat -c %d /))

Команда, которую вы пробуете, для меня понятна. Однако вы можете использовать утилиту file вместе с find, как показано ниже.

find / -maxdepth 10 -size +100000 -exec sh -c 'file -b {} | grep text &>/dev/null' \; -print

Другой способ сделать это — использовать следующую команду.

du -BM / | sort -nr

Эта команда предоставит вам файлы в отсортированном порядке по размеру.

Если вы используете coreutils > 7.5, вы можете выполнить нижеуказанную команду, чтобы отобразить файлы по размерам.

du -ah / | grep -v "/$" | sort -h

На моем компьютере опция sort -h была недоступна.

Как вы упомянули в комментарии, ваш человекопонятный формат — это файл должен иметь размер в kb, mb или gb. Я бы выбрал вторую команду, которую я привел в ответе. Вывод, который я получил, когда использовал это на своей системе:

du -BM /home/ramesh/chk1/ | sort -nr

50M     /home/ramesh/chk1/
21M     /home/ramesh/chk1/Hierarchical_Clustering_Working
3M      /home/ramesh/chk1/checking_files
1M      /home/ramesh/chk1/checking/checking2
1M      /home/ramesh/chk1/checking/checking1
1M      /home/ramesh/chk1/checking/asdf
1M      /home/ramesh/chk1/checking

Я думаю, что вы ищете что-то похожее на следующее.

find / -maxdepth 10 -size +100000 -exec ls -lah {} + 

Опция -exec позволяет вам выполнять команду, а {} заменяется на результат find. Наконец, + указывает find, что это конец команды, и это обязательно.

Мне больше нравится чистый вывод du -bah по сравнению с ls -hl (хотя хотелось бы, чтобы я мог использовать du -hab для запоминания, но порядок важен):

find / -maxdepth 10 -size +100000 -exec du -bah {} + 2> /dev/null

Опция du‘s -b, --bytes или --apparent-size --block-size=1 необходима, так как du обычно показывает размеры блоков диска, а не точный размер файла.

Обратите внимание, что опция du -b может отсутствовать в du на системах macOS.

Еще один, reasonably легкий способ (все еще вызывает отдельное форматирование для каждого файла):

find /my/dir/ -type f -size +100M -printf "%s\t%p\n" | while read sz name; do
    human=$(echo $sz | numfmt --to=iec); 
    printf "%-8s '%s'\n" $human $name; 
done | sort -h

Есть несколько способов оптимизировать дальше (предварительная фильтрация файлов, как я делаю выше, сортировка по сырым размерам сначала, затем преобразование в человекопонятный формат и повторная сортировка топ-N и т. д.).

Ответ или решение

Для отображения "читаемых" размерных величин файлов в результатах команды find на вашем сервере CentOS, вы можете использовать несколько подходов, так как find сам по себе не поддерживает форматирование размера файлов в читабельном виде. Вот некоторые из наиболее эффективных способов решения этой задачи:

Способ 1: Использование команды ls -lh

Вы можете использовать find в сочетании с командой ls для отображения файлов. Например:

find / -maxdepth 10 -size +100000 -exec ls -lh {} +

Здесь мы используем -exec для выполнения команды ls -lh, которая выводит информацию о файлах в читабельном формате, включая размеры с суффиксами (K, M, G и т.д.).

Способ 2: Использовать du

Вы также можете использовать команду du, которая может выдавать размеры файлов и директорий в читаемом формате:

find / -maxdepth 10 -size +100000 -exec du -h {} +

Команда du -h выведет размер каждого файла в понятном формате.

Способ 3: Использование numfmt для настройки размера

Если вам необходима более контролируемая обработка выводимых значений, вы можете использовать numfmt. Вот как это можно сделать:

find /my/dir/ -type f -size +100M -printf "%s\t%p\n" | while read size name; do
    human=$(numfmt --to=iec "$size"); 
    printf "%-8s '%s'\n" "$human" "$name"; 
done | sort -h

В этом примере find выводит размер в байтах и имя файла, и затем каждый размер преобразуется в читаемый формат с помощью numfmt.

Способ 4: Использование du для сортировки файлов

Если вы хотите получить список файлов в определённой директории и отсортировать их по размеру, попробуйте:

du -ah / | sort -h

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

Способ 5: Уточнение поиска по файловым системам

Рекомендуется также использовать опцию -xdev, чтобы избежать рекурсивного поиска по другим файловым системам:

find / -xdev -maxdepth 10 -size +100000 -exec ls -lh {} +

Таким образом, вы сможете ограничить поиск только той файловой системой, которая вас интересует.

Заключение

Выбор способа зависит от ваших предпочтений и специфики задачи, которую вы решаете. Все предложенные методы позволяют получить информацию о файлах с читаемыми размерами, что полезно при поиске крупных файлов в системе.

Оцените материал
Добавить комментарий

Капча загружается...