Подсчитать количество байтов всех файлов gzip в каталоге - PullRequest
3 голосов
/ 15 декабря 2010

У меня есть скрипт bash, которому нужно знать количество байтов для всех файлов gzip в каталоге. На данный момент я предполагаю, что это просто один каталог без подкаталогов. Очень заманчиво сделать что-то вроде этого:

du -scb /my/dir/*.gz|tail -n 1

Тем не менее, у меня есть тонна файлов. Не расширится ли *.gz до некоторого состояния переполнения? Есть ли более быстрый и безопасный способ проверить этот номер?

Ответы [ 2 ]

4 голосов
/ 15 декабря 2010

Это работает и является "безопасным":

(find . -type f -print0 |
  xargs -0 stat -c '%s' |
  tr '\n' '+'; echo 0) |
  bc

Как это работает:

  • Сначала используйте find, чтобы найти файлы .gz.Выведите их с помощью nul-separator, чтобы мы могли иметь дело со странными именами файлов.
  • xargs разделит группы имен файлов на управляемые куски.Присвойте этим именам stat -c '%s', чтобы получить размеры в байтах (спасибо @Fritschy).
  • tr преобразует символы новой строки в +.Эхо добавляет один дополнительный 0 в конце плюс символ новой строки.Это значит, что мы не получим висячий знак плюс, а bc нужен символ новой строки в конце ввода.
  • Введите огромную сумму в bc.
1 голос
/ 15 декабря 2010
echo $(( $(find . -type f -name '*.gz' -printf '%s+') 0 ))

Если вам нужны огромные значения, измените '%s+' на '%s+0' и измените $(( ... 0 )) на ... | bc

Редактировать : для еще больших значений вы можете использовать %k вместо %s, что дает вам килобайты. Поскольку целое число может переполниться.

Поскольку мы используем только встроенные средства в bash, я не уверен, что длина аргументов исполняемых файлов является проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...