Как я могу перечислить размер каждого файла и каталога (рекурсивно) и отсортировать по размеру в Bash? - PullRequest
101 голосов
/ 18 сентября 2011

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

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

Возможно ли это?

Ответы [ 11 ]

203 голосов
/ 07 февраля 2013

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

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

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

du -a -h --max-depth=1 | sort -hr
18 голосов
/ 18 сентября 2011
du -s -- * | sort -n

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

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

du -smc -- * | sort -n

, потому что общая строка (-c) закончится внизу по понятным причинам:)

PS:

  • См. Комментарии по работе с точечными файлами
  • Я часто использую, например, 'du -smc/ home / / |sort -n | tail ', чтобы понять, где именно находятся большие биты
15 голосов
/ 27 июля 2015

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

du -h -d 1 | sort -n

12 голосов
/ 21 ноября 2013

Команда

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предназначен для "удобочитаемого человеком" (как в сортировке, так и в du)
  • max-depth=0 означает, что du не будет показывать размеры подпапок (удалите это, если хотите показать все размеры каждого файла в каждой подпапке-, subsub-, ..., папка)
  • 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 + с

4 голосов
/ 18 сентября 2011

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

1 голос
/ 26 сентября 2016

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

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

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

0 голосов
/ 07 июня 2015

Я склонен использовать du простым способом.

du -sh */ | sort -n

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

0 голосов
/ 20 апреля 2014

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

0 голосов
/ 13 апреля 2012

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

$ 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 голосов
/ 19 сентября 2011

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

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, жалующаяся на слишком длинный список аргументов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...