Diberikan daftar file dalam files.txt
, saya bisa mendapatkan daftar ukurannya seperti ini:
cat files.txt | xargs ls -l | cut -c 23-30
yang menghasilkan sesuatu seperti ini:
151552
319488
1536000
225280
Bagaimana saya bisa mendapatkan total semua angka itu?
alias sum="paste -sd+ - | bc"
ditambahkan ke penyelesaian shell, terima kasih sobat. . .| x=$(echo <(cat)); echo $((0+${x// /+}+0))
jika Anda ingin semua bash sepanjang waktu:/usr/bin/sum
bc
tidak tersedia di beberapa sistem!awk
, di sisi lain adalah (saya percaya) diperlukan untuk kepatuhan POSIX.Ini dia
sumber
cut
? Itu nomor kolom yang dapat diprediksi, jadi gunakan... | xargs ls -l | awk '{total = total + $5}{END{print total}'
total+=$1
bukannyatotal = total + $1
Alih-alih menggunakan cut untuk mendapatkan ukuran file dari output ls-l , Anda dapat menggunakan langsung:
Awk mengartikan "$ 5" sebagai kolom kelima. Ini adalah kolom dari ls-l yang memberi Anda ukuran file.
sumber
cat tidak akan berfungsi jika ada spasi di nama file. di sini adalah perl one-liner sebagai gantinya.
sumber
Atau jika Anda hanya ingin menjumlahkan angka, masukkan:
sumber
... | python -c'import sys; print(sum(int(x) for x in sys.stdin))'
ketika python 2 menghilang pada akhir tahun ini.TMTWWTDI : Perl memiliki operator ukuran file (-s)
sumber
Seluruh ls -l dan kemudian dipotong agak berbelit-belit ketika Anda memiliki stat . Itu juga rentan terhadap format persis ls-l (tidak berfungsi sampai saya mengubah nomor kolom untuk dipotong )
Juga, perbaiki penggunaan kucing yang tidak berguna .
sumber
<infile command
itu sama dengan (dan dalam urutan yang lebih baik daripada)command <infile
.jika Anda belum menginstal bc, coba
dari pada
$( )
<- mengembalikan nilai mengeksekusi perintah$(( 1+2 ))
<- kembalikan hasil yang dievaluasiecho
<- gema ke layarsumber
Anda dapat menggunakan skrip berikut jika Anda hanya ingin menggunakan skrip shell tanpa awk atau penerjemah lain:
sumber
Saya akan menggunakan "du" sebagai gantinya.
Jika Anda hanya menginginkan nomornya:
sumber
files.txt
besar. Jika jumlah argumen disalurkan untukxargs
mencapai ambang tertentu, itu terpecah atas beberapa panggilan kedu
. Total yang ditunjukkan di akhir adalah total untuk panggilan terakhirdu
, bukan seluruh daftar.Dalam ksh:
sumber
cut
, tetapi Anda mengabaikan awks kemampuan untuk melakukan matematika ...Pipa untuk melongo:
sumber
Ini milik saya
sumber
sumber
Saya suka menggunakan ....
mereka akan menunjukkan jumlah setiap baris ...
menerapkan situasi ini:
Total adalah nilai terakhir ...
sumber
Anda dapat menggunakan awk untuk melakukan hal yang sama bahkan melompati non integer
atau Anda dapat menggunakan perintah ls dan menghitung output yang dapat dibaca manusia
sumber
awk '{ total += $1} END {print total}' files.txt
lebih cepatMenurut pendapat saya, solusi paling sederhana untuk ini adalah perintah "expr" unix:
sumber
Bash murni
sumber
Atau Anda bisa menjumlahkannya saat Anda membaca ukurannya
Jika Anda tidak peduli tentang ukuran dan blok gigitan tidak masalah, maka adil
sumber
Jika Anda memiliki R, Anda dapat menggunakan:
Karena saya nyaman dengan R, saya sebenarnya memiliki beberapa alias untuk hal-hal seperti ini sehingga saya dapat menggunakannya
bash
tanpa harus mengingat sintaks ini. Misalnya:yang mari saya lakukan
Inspirasi: Apakah ada cara untuk mendapatkan min, max, median, dan rata-rata daftar angka dalam satu perintah?
sumber