Как перечислить размер каждого файла и каталога и отсортировать по убыванию в Bash?

108

Я обнаружил, что нет простого способа получить размер каталога в Bash?

Я хочу, чтобы при вводе текста ls -<some options>он мог рекурсивно отображать всю сумму размера файла каталога и файлов одновременно и сортировать по порядку размера.

Это возможно?

Кит Хо
источник
2
Что именно вы имеете в виду под «размером» каталога? Количество файлов под ним (рекурсивно или нет)? Сумма размеров файлов под ним (рекурсивно или нет)? Размер диска самой директории? (Каталог реализован в виде специального файла, содержащего имена файлов и другую информацию.)
Кейт Томпсон
должно быть рекурсивно суммой размеров файлов под ним
Кит Хо
1
@Kit: Тогда duэто ответ.
Кейт Томпсон
@KeithThompson Команда @KitHo duоценивает использование файлового пространства, поэтому вы не можете использовать ее, если хотите получить точный размер.
ztank1013
@ ztank1013: В зависимости от того, что вы подразумеваете под «точным размером» du(по крайней мере, версия GNU coreutils), вероятно, имеет возможность предоставить информацию.
Кейт Томпсон

Ответы:

218

Просто перейдите в каталог и выполните следующую команду:

du -a --max-depth=1 | sort -n

ИЛИ добавьте -h для удобочитаемых размеров и -r, чтобы сначала распечатать каталоги / файлы большего размера.

du -a -h --max-depth=1 | sort -hr
Разработчик
источник
23
du -hтребует sort -hтоже, чтобы убедиться, что, скажем, 981Mсортирует раньше 1.3G; с sort -nтолько цифры будут приняты во внимание , и они были бы навыворот.
Smylers
Здесь не указывается размер отдельных файлов в текущем каталоге, а только размер его подкаталогов и общий размер текущего каталога. Как бы вы также включали отдельные файлы в вывод (чтобы ответить на вопрос OP)?
Эрик Траутман
@ErikTrautman, чтобы перечислить файлы, вам также нужно добавить -aи использовать --allвместо --max-depth=1этогоdu -a -h --all | sort -h
Franco
Потрясающие! Я уже несколько лет занимаюсь чем-то более ламерным. :)
Колби Блэр
6
sort -hработает только с версией GNU / Linux, не повезло с BSD / OS X.
djule5
20

Видимо --max-depthопция не в версии Mac OS X в части duкоманды. Вместо этого вы можете использовать следующее.

du -h -d 1 | sort -n

Cevaris
источник
Видимо, но не удивительно.
Джош Хабдас
20
du -s -- * | sort -n

(при этом не будут отображаться скрытые (.dotfiles) файлы)

Используйте du -smдля единиц МБ и т. Д. Я всегда использую

du -smc -- * | sort -n

потому что итоговая строка ( -c) по очевидным причинам окажется внизу :)

PS:

  • См. Комментарии по работе с точечными файлами
  • Я часто использую, например, 'du -smc / home / / | sort -n | tail ', чтобы понять, где именно находятся большие биты
sehe
источник
5
du --max-depth=1|sort -nили find . -mindepth 1 -maxdepth 1|xargs du -s|sort -nдля включения файлов точек.
Арно Ле Блан
@arnoud: Я тоже использую это, но это не кажется подходящим дополнением к этому вопросу (/ ответ) :)
см.
@ arnaud576875, find . -mindepth 1 -maxdepth 1 -print0 | xargs -0 du -s | sort -nесли некоторые из найденных путей могут содержать пробелы.
Пт,
1
Это отличный вариант, чтобы получить удобочитаемый вид самого большого:sudo du -smch * | sort -h | tail
marsbard
16

Команда

du -h --max-depth=0 * | sort -hr

Вывод

3,5M    asdf.6000.gz
3,4M    asdf.4000.gz
3,2M    asdf.2000.gz
2,5M    xyz.PT.gz
136K    xyz.6000.gz
116K    xyz.6000p.gz
88K test.4000.gz
76K test.4000p.gz
44K test.2000.gz
8,0K    desc.common.tcl
8,0K    wer.2000p.gz
8,0K    wer.2000.gz
4,0K    ttree.3

Объяснение

  • du отображает "использование диска"
  • h означает "читабельность человеком" (как по типу, так и по типу)
  • max-depth=0означает, duчто размеры вложенных папок не будут отображаться (удалите это, если вы хотите отображать все размеры каждого файла в каждой вложенной, вложенной, ..., папке)
  • r для "обратного" (сначала самый большой файл)

ncdu

Когда я пришел к этому вопросу, я хотел очистить свою файловую систему. Инструмент командной строки ncduлучше подходит для этой задачи.

Установка на Ubuntu:

$ sudo apt-get install ncdu

Использование:

Просто введите ncdu [path]в командной строке. Через несколько секунд анализа пути вы увидите что-то вроде этого:

$ ncdu 1.11 ~ Use the arrow keys to navigate, press ? for help
--- / ---------------------------------------------------------
.  96,1 GiB [##########] /home
.  17,7 GiB [#         ] /usr
.   4,5 GiB [          ] /var
    1,1 GiB [          ] /lib
  732,1 MiB [          ] /opt
. 275,6 MiB [          ] /boot
  198,0 MiB [          ] /storage
. 153,5 MiB [          ] /run
.  16,6 MiB [          ] /etc
   13,5 MiB [          ] /bin
   11,3 MiB [          ] /sbin
.   8,8 MiB [          ] /tmp
.   2,2 MiB [          ] /dev
!  16,0 KiB [          ] /lost+found
    8,0 KiB [          ] /media
    8,0 KiB [          ] /snap
    4,0 KiB [          ] /lib64
e   4,0 KiB [          ] /srv
!   4,0 KiB [          ] /root
e   4,0 KiB [          ] /mnt
e   4,0 KiB [          ] /cdrom
.   0,0   B [          ] /proc
.   0,0   B [          ] /sys
@   0,0   B [          ]  initrd.img.old
@   0,0   B [          ]  initrd.img
@   0,0   B [          ]  vmlinuz.old
@   0,0   B [          ]  vmlinuz

Удалить текущий выделенный элемент с помощью d, выйти с CTRL+c

Мартин Тома
источник
Вы также можете написать du -hs * | sort -hr. -s (суммировать) то же самое, что --max-depth = 0
rasmusx
5

ls -Sсортирует по размеру. Затем, чтобы показать размер, выводится ls -lSlong ( -l), отсортированный по size ( -S). Я обычно -hтоже добавляю , чтобы было легче читать, так что ls -lhS,.

Танатос
источник
1
Ах, извините, это не было ясно из вашего сообщения. Хочешь du, вроде кто-то выложил. @sehe: Зависит от вашего определения real - он показывает количество места, которое каталог использует для своего хранения. (Это просто не добавление размера подстатей.) Это не случайное число, и это не всегда 4 КиБ.
Thanatos
1

Просто и быстро:

find . -mindepth 1 -maxdepth 1 -type d | parallel du -s | sort -n

* требуется GNU Parallel .

pje
источник
0

Думаю, я понял, что ты хочешь делать. Это даст отсортированный список всех файлов и всех каталогов, отсортированных по размеру файла и размеру содержимого в каталогах.

(find . -depth 1 -type f -exec ls -s {} \;; find . -depth 1 -type d -exec du -s {} \;) | sort -n
Дворак
источник
Неважно, он предложил гораздо более простое решение. Я узнаю что-то новое каждый день!
dvorak
Я не думаю, что использование du- это вариант, он даст вам лишь приблизительный результат.
ztank1013
0

[расширенная версия]
Это будет намного быстрее и точнее, чем исходная версия ниже, и будет выводить сумму всех размеров файла в текущем каталоге:

echo `find . -type f -exec stat -c %s {} \; | tr '\n' '+' | sed 's/+$//g'` | bc

stat -c %sкоманда на файл будет возвращать его размер в байтах. Приведенная trздесь команда используется для преодоления xargsограничений команды (по-видимому, конвейерная xargsлиния разбивает результаты на большее количество строк, нарушая логику моей команды). Следовательно tr, позаботьтесь о замене перевода строки +знаком (плюс). sedимеет единственную цель - удалить последний +знак из результирующей строки, чтобы избежать жалоб со стороны последней bc(базовой калькулятора) команды, которая, как обычно, выполняет вычисления.

Производительность: я протестировал его в нескольких каталогах и более чем на ~ 150 000 файлов сверху (текущее количество файлов в моем ящике fedora 15), получив, как мне кажется, потрясающий результат:

# time echo `find / -type f -exec stat -c %s {} \; | tr '\n' '+' | sed 's/+$//g'` | bc
12671767700

real    2m19.164s
user    0m2.039s
sys 0m14.850s

На всякий случай, если вы хотите провести сравнение с du -sb /командой, она выведет примерное использование диска в байтах ( -bопция)

# du -sb /
12684646920 /

Как я и ожидал, это немного больше, чем расчет моей команды, потому что duутилита возвращает выделенное пространство для каждого файла, а не фактическое использованное пространство.

[исходная версия]
Вы не можете использовать duкоманду, если вам нужно знать точный общий размер вашей папки, потому что (согласно ссылке на справочную страницу) duоценивается использование файлового пространства. Следовательно, это приведет вас к неправильному результату, приближению (возможно, близкому к размеру суммы, но, скорее всего, больше, чем фактический размер, который вы ищете).

Думаю, на ваш вопрос можно ответить по-разному, но это мой:

ls -l $(find . -type f | xargs) | cut -d" " -f5 | xargs | sed 's/\ /+/g'| bc

Он находит все файлы в папке. каталог (измените. на любой каталог, который вам нравится), также включаются скрытые файлы и (использование xargs) выводит их имена в одной строке, а затем создает подробный список с использованием ls -l. Этот (иногда) огромный вывод передается по конвейеру в команду вырезания, и только пятое поле ( -f5), которое представляет собой размер файла в байтах, берется и снова передается по конвейеру, в результате xargsчего снова создается одна строка размеров, разделенная пробелами. Теперь выполните магию sed, которая заменяет каждое пустое место +знаком плюс ( ) и, наконец, bc(базовый калькулятор) выполняет математические вычисления.

Может потребоваться дополнительная настройка, и у вас может быть lsкоманда, которая жалуется на слишком длинный список аргументов.

ztank1013
источник
если директория слишком велика, она надолго зависает, попробуйте поработать со своим домашним каталогом: p
Kit Ho
@KitHo ну, я боюсь, что нет простого и быстрого способа получить точный результат без поиска каждого файла и добавления его размера, поэтому лень команды в основном зависит от того, сколько файлов находится под искомым каталогом ... Но я верю, что есть есть запас на доработки ... приятный вызов!
ztank1013
@KitHo, привет, взгляни на расширенную версию в моем ответе ... и дай мне знать, конечно!
ztank1013
0

Еще одно простое решение.

$ for entry in $(ls); do du -s "$entry"; done | sort -n

результат будет выглядеть как

2900    tmp
6781    boot
8428    bin
24932   lib64
34436   sbin
90084   var
106676  etc
125216  lib
3313136 usr
4828700 opt

изменение "du -s" на "du -sh" покажет удобочитаемый размер, но мы не сможем выполнить сортировку в этом методе.

Амбал
источник
0

вы можете использовать приведенный ниже список файлов по размеру du -h | sort -hr | more or du -h --max-depth = 0 * | sort -hr | Больше

Гассан Шаванех
источник
0

Я предпочитаю использовать du просто.

du -sh */ | sort -n

Это дает мне представление о том, какие каталоги занимают больше всего места. Позже я смогу выполнить более точный поиск.

Темп
источник
Этот вид работает, но при сортировке игнорирует единицы измерения размера файла.
Benjamin Engwall