Вопрос или проблема
Я пытаюсь найти все крупные файлы на своем сервере 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 {} +
Таким образом, вы сможете ограничить поиск только той файловой системой, которая вас интересует.
Заключение
Выбор способа зависит от ваших предпочтений и специфики задачи, которую вы решаете. Все предложенные методы позволяют получить информацию о файлах с читаемыми размерами, что полезно при поиске крупных файлов в системе.