Как подсчитать количество строк для определенного типа файла в сжатом tgz-файле?

Как подсчитать количество строк для определенного типа файла в сжатом tgz-файле?

Я видел пост ниже, который помог мне получить общее количество строк в каждом файле .tgz, но я хочу посчитать только количество строк файлов .js в этих сжатых папках .tgz, а не все. Как мне это сделать?

https://stackoverflow.com/questions/22064932/count-number-of-lines-of-gz-files-recursviely-on-directory

решение1

Вы хотите извлечь все файлы, соответствующие *.jsстандартному выводу, и использовать их wc -lдля подсчета строк:

tar -x -f file.tgz -O --wildcards '*.js' | wc -l

-Oвыводит данные на стандартный вывод вместо записи файлов на диск (как обычно делает tar).

--wildcardsпозволяет использовать подстановочные знаки в именах извлекаемых файлов (и это, скорее всего, только GNU, хотя в Linux это то, что у вас будет).

Это сделает один файл tar. Если у вас их несколько, вы можете сделать это в цикле и передать вывод цикла в wc -l.

решение2

Чтобы получить количество строк каждого .jsфайла в сжатом архиве tar, попробуйте:

tar -xf file.tgz --to-command='echo " $TAR_FILENAME $(wc -l)"' --wildcards '*.js'

В качестве демонстрации начнем с этого архива:

$ tar --list -f file.tgz
a.js
dir1/
dir1/b.js
other.txt

Теперь давайте получим количество строк для каждого js-файла в архиве:

$ tar -xf file.tgz --to-command='echo " $TAR_FILENAME $(wc -l)"' --wildcards '*.js' 
 a.js 10
 dir1/b.js 15

Улучшение

Если нам нужно более удобное форматирование вывода, мы можем использовать printfвместо echo:

$ tar -xf file.tgz --to-command='printf "%-10s %s\n" "$TAR_FILENAME" "$(wc -l)"' --wildcards '*.js' 
a.js       10
dir1/b.js  15

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

  • -xсообщает tar о необходимости извлечения файлов.

  • -f file.tgzсообщает tar о необходимости извлечения из file.tgz.

  • --to-command='echo "$TAR_FILENAME $(wc -l)"'указывает tar применять эту команду к каждому извлеченному файлу. Tar предоставляет имя каждого файла в переменной окружения $TAR_FILENAME.

  • --wildcardsсообщает tar о необходимости выбора файлов для извлечения с помощью glob.

  • '*.js'указывает файловый глоб для извлечения.

Связанный контент