Как отобразить «читабельные» размеры файлов в результатах поиска?

11

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

find / -maxdepth 10 -size +100000 -ls

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

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

blarg
источник
Какое у вас определение для человека читабельного? Для меня это достаточно читабельно для человека.
manatwork
Вы должны попробовать fileутилиту с find.
Рамеш
@manatwork kb, mb, gb
blarg

Ответы:

10

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за ним следует размер; Размер может иметь дополнительную единицу перед номером. Если вам не нужна максимальная глубина, вы можете использовать ее **/для перехода в подкаталоги. Если вы заботитесь о максимальной глубине, это более обременительно, поскольку в шаблонах глобуса zsh отсутствует способ выражения «не более n вхождений». Чтобы избежать рекурсии между устройствами, используйте dспецификатор glob; вам нужно найти номер устройства, который вы можете отобразить с помощью statкоманды в Linux ( stat -c %d /для отображения только номера) или с помощью собственной statвстроенной функции zsh (запустить zmodload zsh/statдля загрузки).

ls -lh /**/*(L+M99d$(stat -c %d /))
Жиль "ТАК - перестань быть злым"
источник
4

Команда, которую вы пробуете, читается для меня. Тем не менее, вы можете воспользоваться файловой утилитой с помощью команды 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возможности выбора.

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

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
Рамеш
источник
Есть ли способ установить нижний предел для вашей второй команды? Самые большие файлы появляются сверху и быстро исчезают с верхней части оболочки. РЕДАКТИРОВАТЬ - я вижу, вам просто нужно удалить r
blarg
Вы можете перенаправить вывод в файл, добавив > outputв команду. Затем вы можете открыть файл и просмотреть вывод по своему усмотрению :)
Ramesh
Я вижу, что это отображает папки тоже, тогда как я только после файлов
blarg
du -a --max-depth=10 / | sort -rnэто близко я мог придумать. Однако в этом случае он не будет отображать размер в КБ, МБ или ГБ.
Рамеш
1

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

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

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

Тим Хьюз
источник
2
На самом деле совершенно нет необходимости цитировать {}здесь. Одиночные кавычки в команде предназначены для оболочки, но оболочка вообще никогда не увидит ls -lah <args...>команду - она ​​видит {}, что не нужно заключать в кавычки. Он findвидит ls -lah {}и findрасширяет {}, и, как следует из названия -execопции, напрямую findиспользует exec*системный вызов для аргументов, поэтому с пробелами проблем не возникнет, потому что findне будет делить слова на ваши имена файлов.
jw013
1
-aОпция lsне нужна , так как аргументы , как ожидается, будут файлы , а не каталоги. GNU находит использование ls -dilsдля этой -lsопции, поэтому для ее наиболее точного воспроизведения ls -dilsh.
jw013
В первом примере использования -exec команда man find дает следующее : find . -type f -exec file '{}' \; Запускает файл для каждого файла в текущем каталоге или ниже. Обратите внимание, что фигурные скобки заключены в одинарные кавычки, чтобы защитить их от интерпретации как пунктуации сценария оболочки. Точка с запятой аналогичным образом защищена с помощью обратной косой черты, хотя в этом случае также можно было использовать одинарные кавычки.
Тим Хьюз
1
Страница man просто защищает ненужную осторожность. Это не повредит, но я не знаю ни одной оболочки, которая требует {}цитирования.
jw013