Come si può scoprire quanti bit ha un file in un comando?


9

So che posso usare ls -latper scoprire quanti byte ha un file e quindi moltiplicare per 8 per scoprire quanti bit. Ma è possibile solo in una riga di comando?


5
Io non la penso così. Inoltre non vedo alcun uso pratico per una funzionalità del genere ^^
Martin von Wittich,

1
@MartinvonWittich - le velocità di Internet sono spesso fatte in ' bit al secondo' ...
Wilf,

4
@wilf: sovraccarico protocollo negativo.
Ignacio Vazquez-Abrams,

Nel mio caso sto usando questo test di prova: csrc.nist.gov/groups/ST/toolkit/rng/documentation_software.html e il parametro è il numero di bit che voglio analizzare.
Felipe,

Risposte:


15

Con GNU du:

du -b FILE | awk '{ print $1, "* 8" }' | bc

9
Tranne che non serve bc- awkpuò fare la matematica da solo:du -b FILE | awk '{print $1 * 8}
Aragaer

Vedi anche wc -c < FILEper un equivalente portatile (per i file non regolari, ha l'effetto collaterale di leggerli, però)
Stéphane Chazelas,

5

Una soluzione coreutils shell + GNU:

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

L' -c%sopzione per statrestituire solo la dimensione del file in byte, eliminando qualsiasi necessità di ulteriore elaborazione del testo. Questa sintassi è supportata dai coreutils GNU e quindi dovrebbe funzionare con la maggior parte delle distribuzioni di Linux.

Come eccezione su Linux, se si esegue zsh con il modulo opzionale zsh / stat, è necessario specificare un percorso per ottenere i coreutils GNU:

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

@StephaneChazelas Grazie per le informazioni. Risposta aggiornata
Giovanni 1024,

Sembra una buona spiegazione, grazie. Tuttavia nel mio test questo comando mi è tornato: titolo: 7: espressione matematica errata: operando previsto in `% s '] 2; eco 4096000 ---- la risposta è 4096000, ma quali sono gli altri errori?
Felipe,

@FelipeMicaroniLalli Non riesco a riprodurre quell'errore e non vedo alcuna circostanza che possa entrambi (a) dare quel messaggio di errore e, allo stesso tempo, (b) dare la giusta risposta numerica. Curioso.
Giovanni 1024,

3

Con GNU find(precede GNU statdi decenni):

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

Relativamente portabile:

ls -ld -- "$file" | awk '{print $5*8;exit}'

3

È possibile su una riga, perché è possibile inserire più comandi su una riga, ad esempio collegati da pipe o sostituzioni di comandi:

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

(Grazie @frostschutz per l'aggiornamento).


Ha funzionato come un incantesimo per me. ➜ tmp stat random-file-3 | sed -n 's / Dimensione: ([0-9] *). * / \ 1 * 8 / p' | aC ➜ 4096000
Felipe,

Non funzionerà in locali non inglesi o su sistemi non GNU o per un file chiamato ZSize: 5ad esempio
Stéphane Chazelas

1
che ne dici stat -c %s FILEdi stampare direttamente il formato, anziché il sed?
Frostschutz,

2

File singolo:

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

File multipli:

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

Questo funziona anche per un singolo file. Non è completamente a prova di proiettile, vedi il commento di Stephane .

Questi sono comandi conformi allo standard POSIX.


Grande. Eccezionale. ➜ 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 ➜ 4177984 totale
Felipe

1
Si noti che ha effetti collaterali se i file non sono file normali. Il secondo visualizzerebbe un a    bfile come a b(sequenze di spazi vuoti convertiti in un singolo spazio, rimossi spazi vuoti).
Stéphane Chazelas,

@StephaneChazelas con che tipo di file non regolare hai provato, per favore?
Totor,

Qualsiasi tipo (quindici, prese, porte, dispositivi, directory ...). Avrai problemi anche con nomi di file contenenti caratteri di nuova riga. Potresti voler aggiungere unNR == 1
Stéphane Chazelas il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.