¿Cómo puedo obtener el tamaño de stdin?


8

Estoy a punto de comprimir un directorio grande y quiero saber qué tan grande, exactamente, será el archivo resultante.

He intentado usar du:

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

Luego intenté usar la versión del archivo de '-':

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

Estoy seguro de que este número no es exacto. ¿Cómo puedo obtener el tamaño de stdin?

Respuestas:


10

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

duen realidad no cuenta el tamaño del archivo en sí. Simplemente le pide al núcleo que consulte el sistema de archivos, que ya realiza un seguimiento del tamaño del archivo. Por eso es tan rápido. Por eso, y el hecho de que estás contando una secuencia, no un archivo, duno funciona. Supongo que 1.0Kes un tamaño codificado /dev/std*en el núcleo.

La solución es usar wc -c, que cuenta los bytes en lugar de consultar el núcleo:

$ tar -cv dir | wc -c

Si desea una salida similar a du -h:

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

La awkconvierte el número en un resultado legible.


8
Tenga en cuenta que si simplemente omite lo wcsuperfluo, -entonces tampoco necesita el cutcomando posterior .
Janis

1
1.0K es el tamaño de bloque de stdin.
Cody Allan Taylor

6

Con GNU tarsolo puedes hacer:

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

... que generará resultados como ...

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

... en stderr. Del mismo modo, con cualquier tar (o secuencia) que pueda usar ddpara entregar un informe sobre el recuento de bytes. Esto puede ser preferible o no wc, pero el valor ddpredeterminado es un tamaño de bloque de 512 bytes, que es idéntico al tartamaño de bloque de. Si el PIPE_BUF de su sistema es lo suficientemente grande, incluso puede expandir ddel tamaño de bloque para que coincida con tarel tamaño de registro, que es de 20 bloques o 10240 bytes. Me gusta esto:

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

Esto puede o no ofrecer una solución más eficaz que wc.

En los dos ddy tarlos casos de uso que no necesita realmente deshacerse de la corriente, sin embargo. Redirijo a lo /dev/nullanterior, pero podría haber redirigido fácilmente a algún archivo y aún recibir el informe sobre su tamaño en el momento en que se escribió.


En caso de que el archivo se escriba en el disco, no sería útil determinar por separado el tamaño, ya que esa información se almacena con el archivo. (+1) para la ganancia de rendimiento esperada de dd(en comparación con wc).
Janis

1
@Janis, posiblemente cierto en el caso más simple, pero imagine más bien que ddla salida se transmite, por ejemplo, a un compresor, y por cualquier razón, le resulta deseable conocer tanto el tamaño sin formato del archivo como el comprimido. También es útil obtener un informe instantáneo sobre los recuentos de registros, tarno es solo un archivo, sino un formato continuo. Se puede usar de otras maneras que no sea simplemente guardar en un grupo de archivos en otro archivo. A menudo es útil para bloquear una secuencia antes de modificarla. En cada uno de esos límites de registro hay un bloque completo de NUL.
mikeserv 01 de

5

Sugeriría:

tar cf - dir | wc -c

Se usa un simple c(no -se requiere el inicio) para crear un tararchivo, fespecifica un archivo de salida y -denota que es stdout . (Tenga en cuenta que si quieres sólo el tamaño y hay muchos archivos por debajo de dir es posible que en lugar de omitir tar's vpor razones de rendimiento.)


@mikeserv; Me parece recordar que trabajé con tars en el pasado donde se requería especificar un archivo tar (así fy -). - Solo lo busqué; sin f -el tarsupuesto /etc/mt0por defecto.
Janis

1
Lo busqué en un libro que usé como manual en ese momento, y creo que se basó en SysV R4. Pocas personas ciertamente recuerdan lo que /etc/mt0realmente significa: "cinta magnética" ;-) Me interesaría cómo se tarcomporta Solaris (porque Solaris es uno de los sistemas operativos contemporáneos que se sabe que todavía tiene cosas realmente viejas /bin).
Janis

@mikeserv; PD: El libro menciona los "Volúmenes 1, 2A, 2B" del Manual de Programadores UNIX de AT&T como fuente (pero sin fecha manual o versión de lanzamiento de UNIX, pero debe haber sido de principios de los años 80, 1983, más o menos).
Janis

¿Alguna vez has visto esto ? Sin relación, pero lo encontré hoy y pensé que te podría gustar.
mikeserv 01 de

No entiendo cómo esta respuesta es diferente de la mía. ¿Es la presencia de la -fbandera a tar?
Strugee

1

La redacción de su pregunta se presta a las tar ... | wc -crespuestas anteriores. Originalmente leí su pregunta con una suposición silenciosa de que deseaba que se informara el tamaño mientras creaba el archivo tar (¿tal vez la salida de tar se canalizaba a través de un enlace de red?).

En cuyo caso, sugeriría pv: visor de tuberías. He visto referencias a él, pero aún no he tenido la oportunidad de jugar con él.

Referencias

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.