Добавьте столбец чисел в оболочке Unix - PullRequest
178 голосов
/ 29 мая 2009

Имея список файлов в files.txt, я могу получить список их размеров, например:

cat files.txt | xargs ls -l | cut -c 23-30

, который производит что-то вроде этого:

  151552
  319488
 1536000
  225280

Как я могу получить всего всех этих чисел?

Ответы [ 20 ]

360 голосов
/ 09 августа 2013
... | paste -sd+ - | bc

самый короткий из найденных мной (из командной строки UNIX блога).

Редактировать: добавил аргумент - для переносимости, спасибо @Dogbert и @ Оуэн.

147 голосов
/ 29 мая 2009

Здесь идет

cat files.txt | xargs ls -l | cut -c 23-30 | 
  awk '{total = total + $1}END{print total}'
9 голосов
/ 06 марта 2011

cat не будет работать, если в именах файлов есть пробелы. вместо этого здесь используется perl one-liner.

perl -nle 'chomp; $x+=(stat($_))[7]; END{print $x}' files.txt
8 голосов
/ 12 августа 2009

Вместо использования cut для получения размера файла из вывода ls -l , вы можете использовать напрямую:

$ cat files.txt | xargs ls -l | awk '{total += $5} END {print "Total:", total, "bytes"}'

Awk интерпретирует "5 $" как пятый столбец. Это столбец из ls -l , в котором указан размер файла.

7 голосов
/ 04 июня 2013
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))"
5 голосов
/ 27 сентября 2011

TMTWWTDI : Perl имеет оператор размера файла (-s)

perl -lne '$t+=-s;END{print $t}' files.txt
4 голосов
/ 11 ноября 2015

если у вас не установлен bc, попробуйте

echo $(( $(... | paste -sd+ -) ))

вместо

... | paste -sd+ - | bc

$( ) <- вернуть значение выполнения команды </p>

$(( 1+2 )) <- вернуть оцененные результаты </p>

echo <- отобразить его на экране </p>

3 голосов
/ 12 августа 2015

Весь ls -l и затем cut довольно запутанны, когда у вас есть stat . Он также уязвим для точного формата ls -l (он не работал, пока я не изменил номера столбцов для cut )

Также исправлено бесполезное использование кошки .

<files.txt  xargs stat -c %s | paste -sd+ - | bc
3 голосов
/ 29 мая 2009

В кш:

echo " 0 $(ls -l $(<files.txt) | awk '{print $5}' | tr '\n' '+') 0" | bc
3 голосов
/ 29 мая 2009

Вы можете использовать следующий скрипт, если вы просто хотите использовать сценарии оболочки без 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...