Biorąc pod uwagę listę plików files.txt
, mogę uzyskać listę takich rozmiarów:
cat files.txt | xargs ls -l | cut -c 23-30
co daje coś takiego:
151552
319488
1536000
225280
Jak mogę uzyskać sumę wszystkich tych liczb?
... | paste -sd+ - | bc
jest najkrótszy, jaki znalazłem (z bloga wiersza poleceń systemu UNIX ).
Edycja: dodano -
argument za przenośnością, dzięki @Dogbert i @Owen.
alias sum="paste -sd+ - | bc"
dodano do ukończenia powłoki, dzięki kolego. . .| x=$(echo <(cat)); echo $((0+${x// /+}+0))
jeśli chcesz cały bash cały czas:/usr/bin/sum
bc
nie jest dostępny w niektórych systemach!awk
, z drugiej strony jest (jak sądzę) wymagany do zgodności z POSIX.Tutaj idzie
źródło
cut
? To przewidywalny numer kolumny, więc użyj... | xargs ls -l | awk '{total = total + $5}{END{print total}'
total+=$1
zamiasttotal = total + $1
Zamiast używać cut do uzyskania rozmiaru pliku z wyjścia ls -l , możesz użyć bezpośrednio:
Awk interpretuje „5 $” jako piątą kolumnę. To jest kolumna od ls -l, która podaje rozmiar pliku.
źródło
cat nie będzie działać, jeśli w nazwach plików są spacje. tutaj zamiast tego jest jeden liniowy perl.
źródło
Lub jeśli chcesz tylko zsumować liczby, potokuj w:
źródło
... | python -c'import sys; print(sum(int(x) for x in sys.stdin))'
kiedy Python 2 znika pod koniec tego roku.TMTWWTDI : Perl ma operator wielkości pliku (-s)
źródło
Całe ls -l, a następnie cięcie jest raczej skomplikowane, gdy masz stat . Jest także podatny na dokładny format ls -l (nie działał, dopóki nie zmieniłem numerów kolumn dla wycinania )
Naprawiono także bezużyteczne korzystanie z cat .
źródło
<infile command
to samo (w lepszej kolejności niż)command <infile
.jeśli nie masz zainstalowanego bc, spróbuj
zamiast
$( )
<- zwraca wartość wykonania polecenia$(( 1+2 ))
<- zwraca ocenione wynikiecho
<- wyświetl echo na ekranieźródło
Możesz użyć następującego skryptu, jeśli chcesz używać skryptów powłoki bez awk lub innych interpreterów:
źródło
Zamiast tego użyłbym „du”.
Jeśli chcesz tylko numer:
źródło
files.txt
jest duży. Jeśli liczba przekazanych argumentów doxargs
określonego progu osiąga określony próg, dzieli je na wiele wywołań dodu
. Suma pokazana na końcu jest sumą tylko ostatniego połączeniadu
, a nie całej listy.W ksh:
źródło
cut
, ale ignorujesz umiejętność matematyki do wykonywania matematyki ...Rura do gawk:
źródło
To moje
źródło
źródło
Lubię używać ....
pokażą sumę każdej linii ...
zastosowanie w tej sytuacji:
Suma jest ostatnią wartością ...
źródło
Możesz użyć awk, aby zrobić to samo, nawet pomija liczby całkowite
lub możesz użyć polecenia ls i obliczyć dane wyjściowe czytelne dla człowieka
źródło
awk '{ total += $1} END {print total}' files.txt
jest szybszyMoim zdaniem najprostszym rozwiązaniem tego jest komenda unix „expr”:
źródło
Pure Bash
źródło
Lub możesz je po prostu zsumować, czytając rozmiary
Jeśli nie zależy ci na rozmiarach zgryzu i blokach jest OK, to po prostu
źródło
Jeśli masz R, możesz użyć:
Ponieważ czuję się dobrze z R, mam kilka aliasów dla takich rzeczy, więc mogę ich używać
bash
bez konieczności pamiętania tej składni. Na przykład:co ja zrobię
Inspiracja: Czy istnieje sposób uzyskania minimalnej, maksymalnej, mediany i średniej listy liczb w jednym poleceniu?
źródło