Имея список файлов в files.txt, я могу получить список их размеров, например:
files.txt
cat files.txt | xargs ls -l | cut -c 23-30
, который производит что-то вроде этого:
151552 319488 1536000 225280
Как я могу получить всего всех этих чисел?
... | paste -sd+ - | bc
самый короткий из найденных мной (из командной строки UNIX блога).
Редактировать: добавил аргумент - для переносимости, спасибо @Dogbert и @ Оуэн.
-
Здесь идет
cat files.txt | xargs ls -l | cut -c 23-30 | awk '{total = total + $1}END{print total}'
cat не будет работать, если в именах файлов есть пробелы. вместо этого здесь используется perl one-liner.
perl -nle 'chomp; $x+=(stat($_))[7]; END{print $x}' files.txt
Вместо использования cut для получения размера файла из вывода ls -l , вы можете использовать напрямую:
$ cat files.txt | xargs ls -l | awk '{total += $5} END {print "Total:", total, "bytes"}'
Awk интерпретирует "5 $" как пятый столбец. Это столбец из ls -l , в котором указан размер файла.
python3 -c"import os; print(sum(os.path.getsize(f) for f in open('files.txt').read().split()))"
Или, если вы хотите просто сложить числа, укажите в:
python3 -c"import sys; print(sum(int(x) for x in sys.stdin))"
TMTWWTDI : Perl имеет оператор размера файла (-s)
perl -lne '$t+=-s;END{print $t}' files.txt
если у вас не установлен bc, попробуйте
echo $(( $(... | paste -sd+ -) ))
вместо
$( ) <- вернуть значение выполнения команды </p>
$( )
$(( 1+2 )) <- вернуть оцененные результаты </p>
$(( 1+2 ))
echo <- отобразить его на экране </p>
echo
Весь ls -l и затем cut довольно запутанны, когда у вас есть stat . Он также уязвим для точного формата ls -l (он не работал, пока я не изменил номера столбцов для cut )
Также исправлено бесполезное использование кошки .
<files.txt xargs stat -c %s | paste -sd+ - | bc
В кш:
echo " 0 $(ls -l $(<files.txt) | awk '{print $5}' | tr '\n' '+') 0" | bc
Вы можете использовать следующий скрипт, если вы просто хотите использовать сценарии оболочки без awk или других интерпретаторов:
#!/bin/bash total=0 for number in `cat files.txt | xargs ls -l | cut -c 23-30`; do let total=$total+$number done echo $total