Как я могу получить размер стандартного ввода?

8

Я собираюсь сжать большой каталог, и я хочу знать, насколько большим будет размер получаемого файла.

Я пытался использовать du:

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

Затем я попытался использовать версию файла '-':

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

Я уверен, что это число не точное. Как я могу получить размер стандартного ввода?

strugee
источник

Ответы:

10

тл; др :tar -cv dir | wc -c - | cut -d' ' -f 1 | awk '{print $1/1000"K"}'

duфактически не учитывает размер самого файла. Он просто просит ядро ​​запросить файловую систему, которая уже отслеживает размер файла. Вот почему это так быстро. Из-за этого и того факта, что вы считаете поток, а не файл, duне работает. Я предполагаю, что 1.0Kэто жестко заданный размер для /dev/std*ядра.

Решение состоит в том, чтобы использовать wc -cсам подсчет байтов вместо запроса к ядру:

$ tar -cv dir | wc -c

Если вы хотите вывод, похожий на du -h:

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

awkПревращает число в результате читабельным.

strugee
источник
8
Обратите внимание, что если вы просто опустите wcлишнее, -то и последующая cutкоманда вам не нужна .
Янис
1
1.0K - это размер блока стандартного ввода.
Коди Аллан Тейлор
6

С GNU tarвы можете просто сделать:

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

... который будет выводить как ...

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

... на stderr. Точно так же с любым tar (или потоком) вы можете использовать ddдля доставки отчета о количестве байтов. Это может быть или не быть предпочтительным wc, но по ddумолчанию размер блока составляет 512 байт, что соответствует tarразмеру блока в России. Если PIPE_BUF вашей системы достаточно велик, вы можете даже увеличить ddразмер блока до соответствия tarразмеру записи - который составляет 20 блоков или 10240 байт. Нравится:

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

Это может или не может предложить более эффективное решение, чем wc.

В обоих ddи tarпотребительных случаях вам не нужно на самом деле избавиться от потока, хотя. Я перенаправил на /dev/nullвыше - но я мог так же легко перенаправить на какой-то файл и все же получить отчет о его размере на момент его написания.

mikeserv
источник
В случае, если файл будет записан на диск, не будет никакого смысла отдельно определять размер, так как эта информация хранится вместе с файлом. (+1) для ожидаемого увеличения производительности dd(по сравнению с wc).
Янис
1
@Janis - возможно, верно в простейшем случае - но скорее представьте, что ddвыходные данные передаются - скажем, в компрессор - и по любой причине вы считаете желательным знать как сырой размер архива, так и сжатый. Также полезно получить мгновенный отчет о количестве записей - tarэто не просто архив, а потоковый формат. Его можно использовать не только для сохранения в группу файлов, но и в другой файл. Это часто полезно для блокировки потока перед его изменением. На каждой из этих границ записи находится целый блок NUL.
mikeserv
5

Я бы предложил:

tar cf - dir | wc -c

Простой c(ведение -не требуется) используется для создания tarархива, fуказывает выходной файл и -обозначает, что это будет стандартный вывод . (Обратите внимание , что если вы хотите только размер и есть много файлов под реж вы можете довольно Опустить tar«s vсоображения производительности.)

Janis
источник
@mikeserv; Кажется, я вспоминаю, что tarв прошлом я работал с s, где требовалось указать tar-файл (таким образом fи -). - Просто посмотрел; без предполагается по умолчанию. f -tar/etc/mt0
Янис
1
Я посмотрел это в книге, которую я использовал в то время как руководство, и я думаю, что она основана на SysV R4. Мало кто наверняка помнит, что на /etc/mt0самом деле означает - «магнитная лента» ;-) Мне было бы интересно, как tarведет себя Solaris (потому что Solaris - одна из современных ОС, о которой известно, что в ней все еще очень старые вещи /bin).
Янис
@mikeserv; PS: в книге в качестве источника упоминается книга AT & T "Тома 1, 2A, 2B" для программистов UNIX (но не указывается дата выпуска или версия UNIX; хотя, должно быть, это было в начале 1980-х, 1983 или около того).
Янис
Вы когда-нибудь видели это ? Не имеет отношения - но я только что нашел это сегодня и подумал, что тебе это может понравиться.
mikeserv
Я не совсем понимаю, чем этот ответ отличается от моего. это наличие -fфлага tar?
Strugee
1

Формулировка вашего вопроса поддается tar ... | wc -cответам выше. Первоначально я прочитал ваш вопрос с молчаливым предположением, что вы хотели, чтобы о размере сообщали во время создания файла tar (возможно, вывод tar затем передавался по сетевой ссылке?).

В этом случае я бы предложил pv- просмотрщик трубы. Я видел ссылку на это, но еще не было возможности поиграть с ним.

Ссылки

Джефф Шаллер
источник