Como contar o número de linhas para um tipo de arquivo específico em um arquivo compactado tgz?

Como contar o número de linhas para um tipo de arquivo específico em um arquivo compactado tgz?

Vi a postagem abaixo que me ajuda a obter o número total de linhas em cada arquivo .tgz, mas quero contar apenas o número de linhas de arquivos .js nessas pastas .tgz compactadas, não tudo. Como eu faço isso?

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

Responder1

Você deseja extrair todos os arquivos correspondentes *.jsao stdout e usá-los wc -lpara contar as linhas:

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

-Oenvia para stdout em vez de gravar arquivos no disco (como o tar normalmente faz).

--wildcardspermite usar curingas nos nomes de arquivos extraídos (e provavelmente é apenas GNU, embora no Linux seja isso que você terá).

Isso criará um único arquivo tar. Se você tiver vários, poderá fazer isso em um loop e canalizar a saída de um loop para wc -l.

Responder2

Para obter a contagem de linhas de cada .jsarquivo em um arquivo tar compactado, tente:

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

Como demonstração, vamos começar com este arquivo:

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

Agora, vamos obter a contagem de linhas para cada arquivo js no arquivo:

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

Melhoria

Se quisermos uma formatação melhor da saída, podemos usar printfem vez de echo:

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

Como funciona

  • -xdiz ao tar para extrair arquivos.

  • -f file.tgzdiz ao tar para extrair de file.tgz.

  • --to-command='echo "$TAR_FILENAME $(wc -l)"'diz ao tar para aplicar este comando a cada arquivo extraído. Tar fornece o nome de cada arquivo na variável de ambiente $TAR_FILENAME.

  • --wildcardsdiz ao tar para escolher os arquivos a serem extraídos usando um glob.

  • '*.js'especifica o arquivo glob a ser extraído.

informação relacionada