Dapatkan ukuran total file dari file yang berisi daftar file

14

Saya memiliki file yang berisi daftar file yang saya ingin tahu ukuran file total. Apakah ada perintah untuk melakukannya?

OS saya adalah linux yang sangat mendasar (Qnap TS-410).

EDIT:

Beberapa baris dari file:

/ share / arsip / Uji Bailey / BD006 / 0.tga
/ share / arsip / Bailey / BD007 / 1 versi 1.tga
/ share / arsip / Bailey 2 / BD007 / example.tga

Nicolas
sumber
Beri kami beberapa contoh baris file.
EEAA
Contoh dari file yang ditambahkan.
Nicolas
Itu semacam NAS, kan? Apakah Anda memiliki busybox yang diinstal?
cjc
Ya itu dan saya pikir sudah terpasang, mengapa?
Nicolas

Jawaban:

13

Saya yakin sesuatu seperti ini akan berfungsi di busybox:

du `cat filelist.txt` | awk '{i+=$1} END {print i}'

Saya tidak memiliki lingkungan yang sama dengan Anda, tetapi jika Anda menemukan masalah dengan spasi dalam nama file, sesuatu seperti ini akan bekerja juga:

cat filelist.txt | while read file;do
  du "$file"
done | awk '{i+=$1} END {print i}'

Sunting 1 :
@stew tepat di posnya di bawah ini, du menunjukkan penggunaan disk dan bukan ukuran file yang tepat. Untuk mengubah perilaku busybox menggunakan flag -a, jadi coba: du -a "$file"untuk ukuran file yang tepat dan bandingkan output / perilaku.

Mattias Ahnberg
sumber
1
Terima kasih atas masukan Anda, perintah pertama kembali /usr/bin/du: Argument list too long(hampir 80.000 baris di file saya). Anda perintah kedua hanya memberi saya prompt setelah saya menekan enter, menunggu sesuatu yang lebih?
Nicolas
Sulit dikatakan dengan lingkungan Anda. Apakah ini prompt perintah normal, atau hanya prompt yang berkedip? Jika itu yang terakhir mungkin lambat menunggu hasilnya, jika ini merupakan "input prompt" mungkin Anda melewatkan beberapa karakter? Dan jika itu prompt normal saya tidak tahu, saya mengujinya dengan cukup teliti sebelum saya mengetiknya. :(
Mattias Ahnberg
ini merupakan "input prompt" ketika saya melakukan hal berikut cat tgafiles.txt | while read file;do du "$file" done | awk '{i+=$1} END {print i}'. terima kasih mattias
Nicolas
1
Ah! Jika Anda meletakkan semuanya pada satu baris, Anda membutuhkan yang lain; seperti ini: cat tgafiles.txt | while read file;do du "$file";done | awk '{i+=$1} END {print i}'(yaitu sebelum dilakukan).
Mattias Ahnberg
Temukan! Itu bekerja dengan sempurna, tepuk tangan! (walaupun saya bisa menemukan kesalahan ini sendiri)
Nicolas
8
du -c `cat filelist.txt` | tail -1 | cut -f 1

-cmenambahkan garis "ukuran total";
tail -1mengambil baris terakhir (dengan ukuran total);
cut -f 1memotong kata "total".

olegzhermal
sumber
Ini gagal karena daftar argumen terlalu panjang. Daftar file saya besar. Jawaban di bawah ini dengan xargs tampaknya menjadi solusi termudah.
Syclone0044
4

Saya tidak tahu apakah alat linux Anda mampu melakukan ini, tetapi:

cat /tmp/filelist.txt  |xargs -d \\n du -c

Do, xargs akan menetapkan pembatas menjadi karakter baris baru, dan du akan menghasilkan total besar untuk Anda.

Melihat di http://busybox.net/downloads/BusyBox.html tampaknya "busybox du" akan mendukung opsi grand total, tetapi "busybox xargs" tidak akan mendukung pembatas khusus.

Sekali lagi, saya tidak yakin dengan perangkat Anda.

cjc
sumber
inilah hasilnya:xargs: invalid option -- d
Nicolas
Luar biasa: bekerja dengan linux busybox NAS seperti episode McGuyver, mencoba membangun pesawat yang berfungsi dari beberapa kanvas, stik, dan benang.
cjc
Bagaimana dengan ini, jika Anda memiliki ruang untuk itu pada mesin yang berbeda: salin semua file yang Anda minati ke beberapa linux lain yang berfungsi penuh, dan kemudian jalankan solusi Stew di sana. Melakukan hal itu mungkin jauh lebih mudah daripada mencoba mencari tahu apakah busybox mampu melakukan hal semacam ini.
cjc
1
Saya pikir jawabannya adalah yang terbaik. Ringkas, dan jauh lebih cepat daripada jawaban lain di utas ini.
zymhan
Jawaban yang bagus. Anda mungkin ingin keluar -ckarena xargs akan melakukan beberapa panggilan ke dujika daftar file cukup panjang, menghasilkan beberapa dutotal.
qwr
4
while read filename ;  do stat -c '%s' $filename ; done < filelist.txt | awk '{total+=$1} END {print total}'

Ini mirip dengan solusi Mattias Ahnberg. Menggunakan "read" mengatasi masalah dengan nama file / direktori dengan spasi. Saya menggunakan statalih-alih duuntuk mendapatkan filesize. du mendapatkan jumlah ruang yang digunakan pada disk alih-alih ukuran file, yang mungkin berbeda. Bergantung pada sistem file Anda, file 1 byte masih akan menempati 4k pada disk (atau apa pun ukuran blokasinya). Jadi untuk file 1 byte, stat mengatakan 1 byte dan du mengatakan 4k.

rebus
sumber
Komentar bagus tentang filesize vs disksize!
Mattias Ahnberg
Komentar yang sangat menarik memang, sayangnya linux saya tidak tahu statperintah:stat: command not found
Nicolas
Anda mungkin harus mengatakan "status kotak sibuk".
cjc
katanya stat: applet not founddalam kasus ini
Nicolas
4

Inilah solusi lain untuk masalah ini:

cat filelist.txt | tr '\n' '\0' | wc -c --files0-from=-
dsamarin
sumber
Bagi saya (di cygwin) du -bcberjalan jauh lebih cepat.
qwr
2

Coba sesuatu seperti ini:

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

Untuk menangani spasi di jalur dengan benar:

$ find /path/to/files -type f -print0 | xargs -0 ls -l | awk '{x+=$5} END {print "total bytes: " x}' 
EEAA
sumber
terima kasih atas masukan Anda, sayangnya saya pikir ada masalah dengan spasi di direktori dalam file saya yang tidak lolos dengan "\"., oleh karena itu rusak saat membaca daftar file.
Nicolas
Bisakah Anda melewati daftar file teks, dan hanya menghasilkan ini dari ouput find?
EEAA
sayangnya daftarnya terlalu panjang, ada 79159 baris file (path lengkap), itu sebabnya saya output ke file; mungkin saya bisa menambahkan argumen tentang melarikan diri dari hasil pencarian?
Nicolas
tidak ada argumen "-print0" dengan penemuan di sistem linux saya
Nicolas
@ Nicolas - itu karena menggunakan stripbox-dipangkas findbukan findbiner nyata .
EEAA
1

cat docs.txt | xargs -d \\n du -sk | awk '{total+=$1} END{print total}'

Pradeep
sumber