Сортування файлів за розміром рекурсивно


78

Мені потрібно знайти найбільші файли в папці.
Як сканувати папку рекурсивно і сортувати вміст за розміром?

Я спробував використовувати ls -R -S, але в цьому списку також є каталоги.
Я також спробував використовувати find.


1
Ви хочете перераховувати файли у кожному підкаталозі окремо чи хочете знайти всі файли у всіх підкаталогах та перелічити їх за розміром незалежно від того, у якому підкаталозі вони перебувають? Також, що ви маєте на увазі під "каталогом" та "папкою"? Ви ніби використовуєте їх для опису різних речей.
terdon

Ви хочете сказати, що ви просто хочете перерахувати файли в заданій директорії, а також файли в її підкаталогах, не показуючи лише підкаталоги? Будь-ласка, спробуйте прибрати та запитання, це не дуже зрозуміло.
slm

Відповіді:


92

Ви також можете це зробити просто 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

14
Ця grep -v "/$"частина, здається, не робить те, що ви очікували, оскільки до каталогів не додається коса риса. Хтось знає, як виключити каталоги з результатів?
Jan Warchoł

@JanekWarchol - яку версію coreutils ви використовуєте?
slm

Я 8.13. Але як би там не було, у висновку у вашій відповіді немає і зворотних /s - наприклад, це /home/saml/Downloads/audibleсхоже на те, що це каталог, але це не має нахилу. Є лише /home/saml/Downloads/коса риса, але це, мабуть, тому, що ви написали її з косою рисою, задаючи аргумент для початкового du.
Ян Ворхол

1
Це знаходить і
дріс

1
У цьому списку не вказано лише файли, а й перелічені каталоги :(
Роман Гауфман,

20

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

Не працює на Mac, на жаль, показує: знайдіть: -printf: невідомий основний або оператор
Роман Гауфман

@RomanGaufman так, саме тому відповідь визначає пошук GNU . Якщо ви встановите інструменти GNU на свій Mac, він також буде працювати там.
terdon

11

Спробуйте виконати таку команду:

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

3
Ідеально, це перше рішення, яке працює на Mac і не показує каталоги :) - дякую!
Роман Гауфман

як фільтр, щоб показати лише файл з кількістю рядків> = X? (X = 0 для зразка)
Матриця

7

Це знайде всі файли рекурсивно та сортувати їх за розміром. Він роздруковує всі розміри файлів в kb і округляє їх, щоб ви могли побачити файли 0 Кб, але це було досить близько для мого використання та працює на OSX.

find . -type f -print0 | xargs -0 ls -la | awk '{print int($5/1000) " KB\t" $9}' | sort -n -r -k1


також працював над Ubuntu 14.04!
Девід Лам

Тут перераховані каталоги, а не лише файли :(
Роман Гауфман,

@RomanGaufman - дякую за відгук! з моїх тестів, find . -type fзнаходить файли ... це працює рекурсивно, ви маєте рацію, але в ньому перераховані всі файли, які він знаходить, а не самі каталоги
Бред Паркс

Xargs використовувався в 1980-х роках. Це погана ідея з 1989 року, коли execplus представив Девід Корн.
schily

5

З zsh, ви знайдете найбільший файл (з точки зору очевидного розміру, як стовпець розміру у ls -lвисновку, а не використання диска) із:

ls -ld -- **/*(DOL[1])

Для 6 найбільших:

ls -ld -- **/*(DOL[1,6])

Щоб сортувати їх за розміром файлу, ви можете скористатися опцією ls' -S. У деяких lsреалізаціях також є -Uможливість lsне сортувати список (оскільки тут вже відсортовано за розміром zsh).


3

Просте рішення для Mac / Linux, яке пропускає каталоги:

find . -type f -exec du -h {} \; | sort -h


0

Це надзвичайно поширена потреба з різних причин (мені подобається знайти останню резервну копію в каталозі), і це напрочуд просте завдання.

Я збираюся запропонувати рішення для Linux, яке використовує утиліти find, xargs, stat, tail, awk та сортування.

Більшість людей надали кілька унікальних відповідей, але я віддаю перевагу моїм, оскільки він належним чином обробляє назви файлів, і випадок використання легко змінювати (змінювати статтю та сортувати аргументи)

Я також запропоную рішення Python, яке повинно дозволяти вам використовувати цю функціональність навіть у Windows

Рішення командного рядка Linux

Рекурсивно повертати весь каталог лише файлів із каталогу, відсортований за розміром файлу

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}'

Пояснення:

  1. find: рекурсивно знаходить усі файли з поточного каталогу та виводить їх з нульовим символом
  2. xargs: утиліта для виконання команд, використовуючи аргументи, надані зі стандартного вводу. Для кожного рядка виводу ми хочемо запустити утиліту stat у цьому файлі
  3. stat: Stat - це приголомшлива команда, яка має стільки випадків використання. Я роздруковую два стовпці, причому перший стовпець має розмір блоку (% s), а другий стовпець - ім'я файлу (% n)
  4. сортувати: сортувати результати за допомогою цифрового перемикача. Оскільки перший аргумент є цілим числом, наші результати будуть сортовані належним чином
  5. хвіст: виберіть лише останній рядок виводу (оскільки список відсортований, це найбільший файл!)
  6. awk: Виберіть другий стовпець, який містить ім'я файлу, і є найбільшим файлом у рекурсивному каталозі.

Рішення Python

#!/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, що дає вам гарний платформний незалежний спосіб вирішення цієї проблеми.



0

Спробуйте нижче команду з опцією сортування, щоб мати папки розміром у порядку зростання

du -sh * | sort -sh


-1

Щось, що працює на будь-якій платформі, крім AIX та HP-UX, це:

find . -ls | sort +6 | tail
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.