
Я видел пост ниже, который помог мне получить общее количество строк в каждом файле .tgz, но я хочу посчитать только количество строк файлов .js в этих сжатых папках .tgz, а не все. Как мне это сделать?
решение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'
указывает файловый глоб для извлечения.