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.