Мне нужно найти самые большие файлы в папке.
Как рекурсивно сканировать папку и сортировать содержимое по размеру?
Я пытался использовать ls -R -S
, но это список каталогов, а также.
Я также пытался использовать find
.
Мне нужно найти самые большие файлы в папке.
Как рекурсивно сканировать папку и сортировать содержимое по размеру?
Я пытался использовать ls -R -S
, но это список каталогов, а также.
Я также пытался использовать find
.
Ответы:
Вы также можете сделать это просто du
. Просто чтобы быть в безопасности, я использую эту версию du
:
$ du --version
du (GNU coreutils) 8.5
Подход:
$ du -ah ..DIR.. | grep -v "/$" | sort -rh
Команда du -ah DIR
выдаст список всех файлов и каталогов в данном каталоге DIR
. -h
Будет производить читаемые размеры человека , которые я предпочитаю. Если вы не хотите их, тогда отпустите этот переключатель. Я использую head -6
только, чтобы ограничить количество продукции!
$ du -ah ~/Downloads/ | head -6
4.4M /home/saml/Downloads/kodak_W820_wireless_frame/W820_W1020_WirelessFrames_exUG_GLB_en.pdf
624K /home/saml/Downloads/kodak_W820_wireless_frame/easyshare_w820.pdf
4.9M /home/saml/Downloads/kodak_W820_wireless_frame/W820_W1020WirelessFrameExUG_GLB_en.pdf
9.8M /home/saml/Downloads/kodak_W820_wireless_frame
8.0K /home/saml/Downloads/bugs.xls
604K /home/saml/Downloads/netgear_gs724t/GS7xxT_HIG_5Jan10.pdf
Достаточно просто отсортировать от наименьшего к большому:
$ du -ah ~/Downloads/ | sort -h | head -6
0 /home/saml/Downloads/apps_archive/monitoring/nagios/nagios-check_sip-1.3/usr/lib64/nagios/plugins/check_ldaps
0 /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/0/index/write.lock
0 /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/0/translog/translog-1365292480753
0 /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/1/index/write.lock
0 /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/1/translog/translog-1365292480946
0 /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/2/index/write.lock
Переверните его, от самого большого до самого маленького:
$ du -ah ~/Downloads/ | sort -rh | head -6
10G /home/saml/Downloads/
3.8G /home/saml/Downloads/audible/audio_books
3.8G /home/saml/Downloads/audible
2.3G /home/saml/Downloads/apps_archive
1.5G /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
1.5G /home/saml/Downloads/digital_blasphemy
Не показывайте мне каталог, только файлы:
$ du -ah ~/Downloads/ | grep -v "/$" | sort -rh | head -6
3.8G /home/saml/Downloads/audible/audio_books
3.8G /home/saml/Downloads/audible
2.3G /home/saml/Downloads/apps_archive
1.5G /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
1.5G /home/saml/Downloads/digital_blasphemy
835M /home/saml/Downloads/apps_archive/cad_cam_cae/salome/Salome-V6_5_0-LGPL-x86_64.run
Если вы просто хотите, чтобы список от самого маленького к самому большому, но из шести самых вредных файлов вы могли поменять переключатель сортировки, drop ( -r
) и использовать tail -6
вместо head -6
.
$ du -ah ~/Downloads/ | grep -v "/$" | sort -h | tail -6
835M /home/saml/Downloads/apps_archive/cad_cam_cae/salome/Salome-V6_5_0-LGPL-x86_64.run
1.5G /home/saml/Downloads/digital_blasphemy
1.5G /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
2.3G /home/saml/Downloads/apps_archive
3.8G /home/saml/Downloads/audible
3.8G /home/saml/Downloads/audible/audio_books
grep -v "/$"
часть, кажется, не выполняет то, что вы ожидали, так как в каталогах нет косой черты. Кто-нибудь знает, как исключить каталоги из результатов?
/
s - например, /home/saml/Downloads/audible
кажется, что это каталог, но у него нет косой черты. /home/saml/Downloads/
Имеет только косую черту, но это, вероятно, потому, что вы указали косую черту при указании аргумента для начального du
.
Если вы хотите найти все файлы в текущем каталоге и его подкаталогах и перечислить их в соответствии с их размером (без учета их пути), и при условии, что ни одно из имен файлов не содержит символов новой строки, с помощью GNU find
вы можете сделать это:
find . -type f -printf "%s\t%p\n" | sort -n
В man find
системе GNU:
-printf format
True; print format on the standard output,
interpreting `\' escapes and `%' directives.
Field widths and precisions can be specified
as with the `printf' C function. Please note
that many of the fields are printed as %s
rather than %d, and this may mean that flags
don't work as you might expect. This also
means that the `-' flag does work (it forces
fields to be left-aligned). Unlike -print,
-printf does not add a newline at the end of
the string. The escapes and directives are:
%p File's name.
%s File's size in bytes.
От man sort
:
-n, --numeric-sort
compare according to string numerical value
Попробуйте следующую команду:
ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20
Он будет рекурсивно перечислять 20 самых больших файлов в текущем каталоге.
Примечание. Параметр -h
for sort
недоступен в OSX / BSD, поэтому необходимо установить sort
с coreutils
(например, через brew
) и применить локальный путь к PATH
бину, например,
export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH" # Add a "gnubin" for coreutils.
Альтернативно используйте:
ls -1Rs | sed -e "s/^ *//" | grep "^[0-9]" | sort -nr | head -n20
Для самых больших каталогов используйте du
, например:
du -ah . | sort -rh | head -20
или же:
du -a . | sort -rn | head -20
Это позволит найти все файлы рекурсивно и отсортировать их по размеру. Он распечатывает файлы всех размеров в килобайтах и округляет их, чтобы вы могли видеть файлы размером 0 КБ, но он был достаточно близок для моего использования и работает на OSX.
find . -type f -print0 | xargs -0 ls -la | awk '{print int($5/1000) " KB\t" $9}' | sort -n -r -k1
find . -type f
находит файлы ... он работает рекурсивно, вы правы, но в нем перечислены все файлы, которые он находит, а не сами каталоги
С помощью zsh
вы найдете самый большой файл (с точки зрения видимого размера, например, размер столбца в ls -l
выводе, а не использования диска) с
ls -ld -- **/*(DOL[1])
Для 6 крупнейших:
ls -ld -- **/*(DOL[1,6])
Для сортировки тех , по размеру файла, вы можете использовать ls
«ы -S
вариант. Некоторые ls
реализации также имеют -U
возможность ls
не сортировать список (так как он уже отсортирован по размеру zsh
).
Это невероятно общая потребность по разным причинам (мне нравится находить самую последнюю резервную копию в каталоге), и это удивительно простая задача.
Я собираюсь представить решение Linux, которое использует утилиты find, xargs, stat, tail, awk и sort.
Большинство людей предоставили несколько уникальных ответов, но я предпочитаю свои, потому что он правильно обрабатывает имена файлов, и вариант использования может быть легко изменен (изменить статистику и отсортировать аргументы)
Я также предоставлю решение Python, которое позволит вам использовать эту функциональность даже в Windows
find . -type f -print0 | xargs -0 -I{} stat -c '%s %n' {} | sort -n
# Each utility is split on a new line to help
# visualize the concept of transforming our data in a stream
find . -type f -print0 |
xargs -0 -I{} stat -c '%s %n' {} |
sort -n |
tail -n 1 |
awk '{print $2}'
# (Notice only the first argument of stat changed for new functionality!)
find . -type f -print0 | xargs -0 -I{} stat -c '%Y %n' {} |
sort -n | tail -n 1 | awk '{print $2}'
Объяснение:
#!/usr/bin/env python
import os, sys
files = list()
for dirpath, dirname, filenames in os.walk(sys.argv[1]):
for filename in filenames:
realpath = os.path.join(dirpath, filename)
files.append(realpath)
files_sorted_by_size = sorted(files, key = lambda x: os.stat(x).st_size)
largest_file = files_sorted_by_size[-1]
print(largest_file)
Этот сценарий требует немного больше времени для объяснения, но, по сути, если вы сохраните его как сценарий, он выполнит поиск по первому аргументу, указанному в командной строке, и вернет самый большой файл в этом каталоге. Скрипт не проверяет ошибки, но он должен дать вам представление о том, как подойти к этому в Python, который дает хороший платформо-независимый способ решения этой проблемы.
Вариант этого ответа от аналогичного вопроса
find . -type f -exec du -ah {} + | sort -rh | more
Попробуйте команду ниже с опцией сортировки, чтобы иметь папки с размером в порядке возрастания
du -sh * | sort -sh