Bagaimana saya bisa mendapatkan ukuran stdin?

8

Saya akan mengkompres direktori besar dan saya ingin tahu seberapa besar, tepatnya, file yang dihasilkan.

Saya sudah mencoba menggunakan du:

$ tar -cv dir | du -h -
du: cannot access '-': No such file or directory

Kemudian saya mencoba menggunakan versi file '-':

$ tar -cv dir | du -h /dev/stdin
1.0K

Saya yakin nomor ini tidak akurat. Bagaimana saya bisa mendapatkan ukuran stdin?

strugee
sumber

Jawaban:

10

tl; dr :tar -cv dir | wc -c - | cut -d' ' -f 1 | awk '{print $1/1000"K"}'

dusebenarnya tidak menghitung ukuran file itu sendiri. Itu hanya meminta kernel untuk meminta filesystem, yang sudah melacak ukuran file. Inilah mengapa sangat cepat. Karena itu, dan fakta bahwa Anda menghitung aliran, bukan file, dutidak berfungsi. Dugaan saya adalah 1.0Kukuran hardcod untuk /dev/std*kernel.

Solusinya adalah menggunakan wc -c, yang menghitung byte itu sendiri alih-alih menanyakan kernel:

$ tar -cv dir | wc -c

Jika Anda ingin keluaran mirip dengan du -h:

$ tar -cv dir | wc -c | awk '{print $1/1000"K"}'

The awkternyata nomor ke hasil terbaca-manusia.

strugee
sumber
8
Perhatikan bahwa jika Anda hanya menghilangkan wcberlebihan -maka Anda tidak perlu cutperintah berikutnya juga.
Janis
1
1.0K adalah ukuran blok stdin.
Cody Allan Taylor
6

Dengan GNU tarAnda bisa melakukannya:

tar --totals -c . >/dev/null

... yang akan menghasilkan output seperti ...

Total bytes written: 5990400 (5.8MiB, 5.5GiB/s)

... di stderr. Demikian pula, dengan tar apa pun (atau streaming) yang dapat Anda gunakan dduntuk mengirimkan laporan tentang jumlah byte. Ini mungkin atau mungkin tidak disukai wc, tetapi ddstandar untuk ukuran blok 512 byte - yang identik dengan tarukuran blok. Jika PIPE_BUF sistem Anda cukup besar, Anda bahkan dapat memperluas ddukuran blok agar sesuai tardengan ukuran catatan - yaitu 20 blok, atau 10240 byte. Seperti ini:

tar -c . | dd bs=bx20 >/dev/null
585+0 records in
585+0 records out
5990400 bytes (6.0 MB) copied, 0.0085661 s, 699 MB/s

Ini mungkin atau mungkin tidak menawarkan solusi yang lebih baik daripada wc.

Baik dalam kasus penggunaan ddmaupun tarkasus, Anda sebenarnya tidak perlu membuang arus. Saya mengarahkan ulang ke /dev/nullatas - tetapi saya bisa dengan mudah diarahkan ke beberapa file dan masih menerima laporan tentang ukurannya pada saat itu ditulis.

mikeserv
sumber
Jika file ditulis ke disk tidak akan ada gunanya untuk secara terpisah menentukan ukuran karena informasi tersebut disimpan bersama file tersebut. (+1) untuk keuntungan kinerja yang diharapkan dari dd(dibandingkan dengan wc).
Janis
1
@ Janis - mungkin benar dalam kasus yang paling sederhana - tetapi bayangkan ddkeluaran itu diteruskan - ke kompresor, katakanlah - dan untuk alasan apa pun Anda merasa perlu mengetahui ukuran mentah dari arsip dan yang dikompresi. Juga berguna adalah untuk mendapatkan laporan instan tentang jumlah catatan - tarbukan hanya arsip, tetapi format aliran. Ini dapat digunakan dengan cara selain hanya menyimpan ke sekelompok file ke beberapa file lainnya. Ini sering berguna untuk memblokir aliran sebelum memodifikasinya. Pada masing-masing batas catatan itu adalah seluruh blok NUL.
mikeserv
5

Saya sarankan:

tar cf - dir | wc -c

Sederhana c(tidak perlu memimpin -) digunakan untuk membuat tararsip, fmenentukan file output dan -menunjukkan bahwa itu adalah stdout . (Perhatikan bahwa jika Anda ingin hanya ukuran dan ada banyak file di bawah dir Anda mungkin agak omit tar's vkarena alasan kinerja.)

Janis
sumber
@ mikeserv; Saya ingat bahwa saya bekerja dengan tars di masa lalu di mana menentukan file tar (dengan demikian fdan -) diperlukan. - Hanya mencarinya; tanpa f -yang tardiasumsikan /etc/mt0sebagai default.
Janis
1
Saya sudah mencarinya di sebuah buku yang saya gunakan sebagai manual pada waktu itu, dan saya pikir didasarkan pada SysV R4. Beberapa orang tentu ingat apa yang /etc/mt0sebenarnya berarti - "pita magnetik" ;-) Saya akan tertarik dengan bagaimana Solaris tarberperilaku (karena Solaris adalah salah satu OS kontemporer yang diketahui masih memiliki barang yang benar-benar tua /bin).
Janis
@ mikeserv; PS: Buku itu menyebutkan AT&T "UNIX Programmers Manual Volumes 1, 2A, 2B" sebagai sumber (tetapi tidak ada tanggal manual atau versi rilis UNIX; namun harus dari awal 1980-an, 1983, atau lebih).
Janis
Pernahkah Anda melihat ini ? Tidak terkait - tetapi saya baru menemukannya hari ini, dan saya pikir Anda mungkin menyukainya.
mikeserv
Saya tidak begitu mengerti bagaimana jawaban ini berbeda dari jawaban saya. apakah itu kehadiran -fbendera tar?
strugee
1

Kata-kata dari pertanyaan Anda cocok dengan tar ... | wc -cjawaban di atas. Saya awalnya membaca pertanyaan Anda dengan asumsi diam-diam bahwa Anda ingin ukurannya dilaporkan saat sedang membuat file tar (mungkin keluaran tar kemudian disalurkan melalui tautan jaringan?).

Dalam hal ini, saya sarankan pv- penampil pipa. Saya telah melihat referensi untuk itu tetapi belum memiliki kesempatan untuk bermain dengannya.

Referensi

Jeff Schaller
sumber