Показать сумму размеров файлов в списке каталогов

72

Команда dirсписка каталогов Windows имеет в конце строку, показывающую общий объем пространства, занимаемого перечисленными файлами. Например, dir *.exeотображаются все .exeфайлы в текущем каталоге, их размеры и общая сумма их размеров. Я хотел бы иметь подобную функциональность с моим dirпсевдонимом в bash, но я не уверен, как именно это сделать.

В настоящее время у меня alias dir='ls -FaGl'в моем .bash_profile, показывая

drwxr-x---+  24 mattdmo  4096 Mar 14 16:35 ./
drwxr-x--x. 256 root    12288 Apr  8 21:29 ../
-rw-------    1 mattdmo 13795 Apr  4 17:52 .bash_history
-rw-r--r--    1 mattdmo    18 May 10  2012 .bash_logout
-rw-r--r--    1 mattdmo   395 Dec  9 17:33 .bash_profile
-rw-r--r--    1 mattdmo   176 May 10  2012 .bash_profile~
-rw-r--r--    1 mattdmo   411 Dec  9 17:33 .bashrc
-rw-r--r--    1 mattdmo   124 May 10  2012 .bashrc~
drwx------    2 mattdmo  4096 Mar 24 20:03 bin/
drwxrwxr-x    2 mattdmo  4096 Mar 11 16:29 download/

например. Принимая ответы на этот вопрос :

dir | awk '{ total += $4 }; END { print total }'

который дает мне общее количество, но не печатает сам список каталогов. Есть ли способ изменить это в однострочном или шелл-сценарии, чтобы я мог передать любые lsаргументы, которые я хочу, dirи получить полный список плюс общая сумма? Например, я хотел бы запустить, dir -R *.jpg *.tifчтобы получить список и общий размер этих типов файлов во всех подкаталогах. В идеале было бы здорово, если бы я мог получить размер каждого подкаталога, но это не обязательно.

MattDMo
источник
5
Почему не ls -lhпомогает? Он печатает общую сумму сверху. Вы также можете запустить, du -sh *.exeчтобы получить информацию об использовании дискового пространства в удобочитаемой форме.
Багавадхар
@ashwin Я не знаю, что ls -lhпечатает «total» , но это не всегда связано с тем, что awkподсчитывают приведенные ниже сценарии, или что я складываю вручную. Иногда оно близко к числу килобайт файлов в каталоге, но, похоже, не учитывает выделенные размеры подкаталогов. Я был бы признателен, если бы вы
указали
посмотрите, работает ли мой ответ ниже для вас
bagavadhar
1
ls -lhне показывает общий размер
каталога,

Ответы:

24

Следующая функция выполняет большую часть того, что вы просите:

dir () { ls -FaGl "${@}" | awk '{ total += $4; print }; END { print total }'; }

... но это не даст вам того, о чем вы просите dir -R *.jpg *.tif, потому что это не так ls -R. Вы можете поиграть с findутилитой для этого.


источник
1
Это верно, если вы ищете по существу размер содержимого каждого файла, а НЕ размер, который файл потребляет на диске. Это различие более заметно для очень маленьких файлов. В моем дистрибутиве каждому файлу выделено место на диске в виде фрагментов по 4 КБ (таким образом, 300-байтовый файл все еще использует 4 КБ на диске, как сообщает команда du). Учитывая, что ОП искал, «сколько места занимает каждый файл», тогда du - способ сделать это.
Джон V
1
dirэто уже название популярного ядра GNU coreutil, я бы не стал называть такую ​​функцию.
десерт
Пожалуйста, исправьте это так, чтобы оно работало как на Linux, так и на OS-S, и ваше «-a» включает «» и "..", что не хорошо:) Вот фиксированная команда: dir () {ls -FAl "$ {@}" | awk '{всего + = 5 долларов США; Распечатать }; END {print "total:" total} '; }
Дмитрий Шевкопляс
148

Для этого уже есть команда UNIX: du

Просто сделать:

du -ach 

В соответствии с соглашением вы можете добавить один или несколько путей к файлам или каталогам в конце команды. -hявляется расширением для преобразования размера в удобный для пользователя формат, -aдает вам «кажущийся» размер (размер файла вместо использования диска) и -cдает итоговое значение в конце.

Пит Корнелл
источник
12
Да, работает нормально. Вы можете использовать опцию -c (так же, как --total), чтобы получить итог в конце списка.
MikeB
6
Обратите внимание, что это duдает использование диска, а не сумму размеров файлов.
Стефан Шазелас
7
du -hне суммирует размеры файлов, переданных ему. du -h *.soпоказывает размер каждого файла, но не сумму. Я думаю, что вы хотите здесь du -hc *.so(или даже du -hc *.so | tail -1). Но, конечно, он тоже хочет получить каталог.
Ограниченное искупление
1
Эта команда работает только с кратким списком файлов. Посмотрите, что происходит, когда у вас есть 850000 файлов в каталоге!
Hamid FzM
3
! -aзначит --all. Рассмотрим скорее использование--apparent-size
Arnauld VM
17

Вы можете использовать du -h -c directory|tail -1

Это сгенерирует одну строку с использованием памяти.

Мани Дипак
источник
15
du -hs directoryесли вы хотите только всего.
Стефан Шазелас
8

Просто напечатайте текущую строку, которую вы суммируете:

dir | awk '{ print; total += $4 }; END { print "total size: ",total }'
Мауриц Хансен
источник
6

с Perl:

perl -le 'map { $sum += -s } @ARGV; print $sum' -- *.pdf

Размер всех не скрытых файлов PDF в текущем каталоге.

ingopingo
источник
1

Добавление следующего в .bash_profile или .bashrc работает для меня.

dir ()
{
find . -iname "$@" -exec ls -lh {} \;
find . -iname "$@" -print0|xargs -r0 du -csh|tail -n 1;
}

Теперь, когда я делаю dir * .mp3, он делает рекурсивно и печатает итог в конце. Вы можете контролировать, какую глубину вы хотите, добавив параметр maxdepth к находке. Я знаю, что поиск дважды - не самая лучшая идея. Но я не мог придумать лучшего пути. По крайней мере, он выполняет свою работу.

bagavadhar
источник
1

Использование du и выражения awk, подобного приведенному выше, обеспечат то, что вы ищете.

Пример: du /home/abc/Downloads/*.jpg | awk '{ print; total += $1 }; END { print "total size: ",total }'

Это перечислит все файлы в папке «Загрузки» пользователя abc, оканчивающиеся на .jpg, и напечатает сумму всех этих файлов в конце списка.

user3085123
источник
0

Чтобы получить как вывод dir, так и расчет размера, без использования других предложенных опций, вы можете использовать tee (1) и процесс подстановки ...

dir | tee >( awk '{ total += $4 }; END { print total }' )
Janis
источник
Не нужно tee, простоdir | awk '{print; total += $4}; END {print total}'
Стефан Шазелас
0
du path_to_your_files/*.jpg | awk '{ total += $1 }; END { print total }'
Укротитель Мансур
источник
3
Во-первых, просто дать команду не является ответом. Во-вторых, если бы вы удосужились прочитать весь вопрос, другие ответы и мои комментарии, вы бы увидели, что это НЕ то, что я хочу.
MattDMo
Если честно, это первый результат поиска в поиске Google, linux sum human readable sizesи это то, что я ищу.
Шридхар Сарнобат
-2
du * | awk -v sum=0 '{print sum+=$1}' | tail -1
Ясон
источник
Это не делает то, что я просил.
MattDMo