Мені потрібно знайти найбільші файли в папці.
Як сканувати папку рекурсивно і сортувати вміст за розміром?
Я спробував використовувати 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
Якщо ви просто хочете, щоб список найменших до найбільших, але 6 найкращих файлів, які ображають, ви можете змінити перемикач сортування, 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
для 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
Це знайде всі файли рекурсивно та сортувати їх за розміром. Він роздруковує всі розміри файлів в kb і округляє їх, щоб ви могли побачити файли 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 та сортування.
Більшість людей надали кілька унікальних відповідей, але я віддаю перевагу моїм, оскільки він належним чином обробляє назви файлів, і випадок використання легко змінювати (змінювати статтю та сортувати аргументи)
Я також запропоную рішення 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