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


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.