Come posso ottenere la dimensione di stdin?


8

Sto per comprimere una directory di grandi dimensioni e voglio sapere quanto sarà grande, esattamente, il file risultante.

Ho provato a usare du:

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

Quindi ho provato a utilizzare la versione del file di '-':

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

Sono certo che questo numero non è preciso. Come posso ottenere la dimensione di stdin?

Risposte:


10

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

duin realtà non conta la dimensione del file stesso. Chiede solo al kernel di interrogare il filesystem, che tiene già traccia delle dimensioni del file. Ecco perché è così veloce. Per questo motivo e per il fatto che stai contando uno stream, non un file, dunon funziona. La mia ipotesi è che 1.0Ksia una dimensione codificata /dev/std*nel kernel.

La soluzione è usare wc -c, che conta i byte stessi invece di interrogare il kernel:

$ tar -cv dir | wc -c

Se si desidera un output simile a du -h:

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

Il awktrasforma il numero in un risultato leggibile dall'uomo.


8
Si noti che se si omette solo wcil superfluo -, non è necessario nemmeno il cutcomando successivo .
Janis,

1
1.0K è la dimensione del blocco di stdin.
Cody Allan Taylor,

6

Con GNU tarpuoi semplicemente fare:

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

... che renderà l'output come ...

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

... su stderr. Allo stesso modo, con qualsiasi tar (o flusso) è possibile utilizzare ddper consegnare un report sui conteggi dei byte. Questo può essere preferibile o meno wc, ma il ddvalore predefinito è una dimensione del blocco di 512 byte, che è identica alla tardimensione del blocco. Se PIPE_BUF del tuo sistema è abbastanza grande, puoi persino espandere ddla dimensione del blocco in modo che corrisponda alla dimensione tardel record - che è di 20 blocchi o 10240 byte. Come questo:

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

Questo può o meno offrire una soluzione più performante di wc.

In entrambe le dde tarcasi d'uso non è necessario in realtà smaltire il flusso, però. Ho reindirizzato a /dev/nullsopra - ma avrei potuto reindirizzare con la stessa facilità a qualche file e ancora ricevuto il rapporto sulla sua dimensione al momento in cui è stato scritto.


Nel caso in cui il file venga scritto su disco, non sarebbe utile determinare separatamente le dimensioni poiché tali informazioni sono archiviate con il file. (+1) per il guadagno di prestazione atteso di dd(rispetto a wc).
Janis,

1
@Janis - possibilmente vero nel caso più semplice - ma immagina piuttosto che ddl'output venga trasmesso - ad un compressore, diciamo - e per qualunque motivo trovi desiderabile conoscere sia la dimensione grezza dell'archivio sia quella compressa. Inoltre è utile ottenere un rapporto istantaneo sui conteggi dei record: tarnon è solo un archivio, ma un formato di flusso. Può essere utilizzato in modi diversi dal semplice salvataggio in un gruppo di file in qualche altro file. È spesso utile per bloccare uno stream prima di modificarlo. In ognuno di questi limiti del record c'è un intero blocco di NUL.
Mikeserv,

5

Suggerirei:

tar cf - dir | wc -c

Un semplice c(non -è richiesto alcun lead ) viene utilizzato per creare un tararchivio, fspecifica un file di output e -indica che è stdout . (Si noti che se si desidera solo la dimensione e ci sono molti file sotto dir si può invece omettere tar's vper motivi di prestazioni.)


@mikeserv; Mi sembra di ricordare che ho lavorato con tars in passato dove era necessario specificare un file tar (quindi fe -). - Ho appena cercato; senza f -l' tarassunto /etc/mt0come predefinito.
Janis,

1
L'ho cercato in un libro che ho usato come manuale a quel tempo e penso che fosse basato su SysV R4. Poche persone certamente ricordano cosa /etc/mt0significhi in realtà: "nastro magnetico" ;-) Sarei interessato al tarcomportamento di Solaris (perché Solaris è uno dei sistemi operativi contemporanei che sono noti per avere ancora cose molto vecchie /bin).
Janis,

@mikeserv; PS: Il libro menziona "Volumi 1, 2A, 2B del manuale dei programmatori UNIX di AT&T come sorgente (ma nessuna data manuale o versione di rilascio UNIX, tuttavia; ma deve essere stata dai primi anni '80, 1983 o giù di lì).
Janis,

Avete mai visto questo ? Non correlato, ma l'ho appena trovato oggi e ho pensato che potrebbe piacerti.
Mikeserv,

Non capisco bene come questa risposta sia diversa dalla mia. è la presenza della -fbandiera tar?
strugee,

1

La formulazione della tua domanda si presta alle tar ... | wc -crisposte sopra. Inizialmente avevo letto la tua domanda con l'assunto silenzioso che volevi che le dimensioni fossero riportate mentre stava creando il file tar (forse l'output di tar veniva quindi reindirizzato su un collegamento di rete?).

Nel qual caso, suggerirei pv: pipe viewer. Ho visto un riferimento ad esso, ma non ho ancora avuto la possibilità di giocarci.

Riferimenti

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.