Bagaimana cara mengetahui berapa banyak bit file dalam satu perintah?

9

Saya tahu saya dapat menggunakan ls -latuntuk mengetahui berapa banyak byte yang memiliki file dan kemudian kalikan dengan 8 untuk mengetahui berapa banyak bit. Tetapi apakah ini mungkin hanya dalam satu baris perintah?

Felipe
sumber
5
Saya kira tidak. Saya juga tidak melihat penggunaan praktis untuk fitur seperti itu ^^
Martin von Wittich
1
@ MartinvonWittich - kecepatan internet sering dilakukan dalam ' bit per detik' ...
Wilf
4
@wilf: Minus protokol overhead.
Ignacio Vazquez-Abrams
Dalam kasus saya, saya menggunakan tes gugatan ini: csrc.nist.gov/groups/ST/toolkit/rng/documentation_software.html dan parameternya adalah jumlah bit yang ingin saya analisis.
Felipe

Jawaban:

15

Dengan GNU du:

du -b FILE | awk '{ print $1, "* 8" }' | bc
cybermage14
sumber
9
Kecuali itu tidak perlu bc- awkbisa melakukan matematika sendiri:du -b FILE | awk '{print $1 * 8}
aragaer
Lihat juga wc -c < FILEuntuk padanan portabel (untuk file non-reguler, meskipun memiliki efek samping membacanya)
Stéphane Chazelas
5

Solusi shell + GNU coreutils:

echo $(( 8 * $(stat -c%s FILE) ))

The -c%spilihan untuk statkembali hanya ukuran file dalam byte, menghilangkan kebutuhan untuk pengolahan teks tambahan. Sintaks ini didukung oleh GNU coreutils dan karenanya harus bekerja di bawah sebagian besar distribusi linux.

Sebagai pengecualian di linux, jika seseorang menjalankan zsh dengan modul zsh / stat opsional, maka seseorang harus menentukan jalur untuk mendapatkan GNU coreutils:

echo $(( 8 * $(command stat -c%s FILE) ))
John1024
sumber
@StephaneChazelas Terima kasih atas informasinya. Jawaban diperbarui.
John1024
Sepertinya penjelasan yang bagus, terima kasih. Namun dalam pengujian saya, perintah ini kembali kepada saya: judul: 7: ekspresi matematika buruk: operan diharapkan pada `% s '] 2; gema 4096000 ---- jawabannya adalah 4096000, tetapi apa kesalahan lainnya?
Felipe
@FelipeMicaroniLalli Saya tidak dapat mereproduksi kesalahan itu dan saya tidak melihat keadaan yang akan (a) memberikan pesan kesalahan itu, dan, pada saat yang sama, (b) memberikan jawaban numerik yang tepat. Ingin tahu.
John1024
3

Dengan GNU find(mendahului GNU statoleh dekade):

find file -prune -printf '%s*8\n' | bc

Relatif portable:

ls -ld -- "$file" | awk '{print $5*8;exit}'
Stéphane Chazelas
sumber
3

Hal ini dimungkinkan dalam satu baris, karena Anda dapat menempatkan beberapa perintah pada satu baris, misalnya terhubung dengan pipa atau penggantian perintah:

echo $(stat -c %s FILE) '* 8' | bc

(Terima kasih @ Frostschutz untuk pembaruan).

choroba
sumber
Bekerja seperti pesona bagiku. ➜ tmp stat random-file-3 | sed -n 's / Ukuran: ([0-9] *). * / \ 1 * 8 / p' | bc ➜ 4096000
Felipe
Tidak akan bekerja di lokal non-Inggris atau pada sistem non-GNU atau untuk file yang dipanggil ZSize: 5misalnya
Stéphane Chazelas
1
bagaimana stat -c %s FILEdengan mencetak ukuran secara langsung, bukan sed?
frostschutz
2

File tunggal:

wc -c yourfile | awk '{print $1*8}'

File mutiple:

wc -c yourfile1 yourfile2 | awk '{$1*=8; print $0}'

Yang ini juga berfungsi untuk satu file. Ini tidak sepenuhnya anti peluru, lihat komentar Stephane .

Ini adalah perintah yang memenuhi standar POSIX.

Totor
sumber
Bagus. Luar biasa. ➜ tmp wc -c random-file-1 random-file-2 random-file-3 | awk '{$ 1 * = 8; print $ 0} '➜ 32832 random-file-1 ➜ 49152 random-file-2 ➜ 4096000 random-file-3 ➜ total 4177984
Felipe
1
Perhatikan bahwa ia memiliki efek samping jika file tersebut bukan file biasa. Yang kedua akan menampilkan a    bfile sebagai a b(urutan kosong dikonversi ke satu ruang, trailing blank dihapus).
Stéphane Chazelas
@StephaneChazelas dengan file non-reguler seperti apa yang Anda coba?
Totor
Semua jenis (fifos, soket, pintu, perangkat, direktori ...). Anda akan memiliki masalah dengan nama file yang mengandung karakter baris baru juga. Anda mungkin ingin menambahkanNR == 1
Stéphane Chazelas