Localiza o nome do arquivo dentro do arquivo tar no diretório diferente

0

Eu quero escrever um script em lote que:

  • Localiza um nome de arquivo
  • O nome do arquivo está dentro de um arquivo tar
  • O arquivo tar está localizado em um diretório diferente
  • O nome do arquivo corresponde a um determinado padrão

Eu quero evitar a untar , se possível, e quero armazenar o nome do arquivo em uma variável .

Meu arquivo tar está localizado em ./foo_tar , chamado bar.tar.gz . Dentro do arquivo tar, quero obter o nome do arquivo começando com baz* , seguido por alguns dígitos e um sublinhado (por exemplo, baz1234_ ).

Até agora, eu sei do comando find , mas ele não funciona ao tentar acessar um arquivo tar. Eu quero algo assim:

filename_in_question=$(find ./foo_tar/bar.tar.gz -name 'baz*')

Existe alguma solução para isso?

    
por tli 09.02.2018 / 11:40

3 respostas

0

Tar pode usar curingas em si

tar tzvf ./foo_tar/bar.tar.gz --wildcards '*/baz*'

Por exemplo:

$ filename_in_question=$(tar tvf test.tar --wildcards '*/received_10205861111464136.mp4')
$ echo $filename_in_question
-rwxr-xr-x ghp/ghp 1931930 2017-11-04 10:36 ./Marieanne/Messenger/received_10205861111464136.mp4
$ echo ${filename_in_question/*\//}
received_10205861111464136.mp4
    
por 09.02.2018 / 12:14
0

find procura apenas arquivos que existem na hierarquia de diretórios, não aqueles armazenados dentro de arquivos. Você pode listar os arquivos com tar -t :

tar -ztf ./foo_tar/bar.tar.gz --wildcards --no-anchored 'baz*'

--wildcards permite que * seja interpretado como um caractere curinga, e --no-anchored permite que o nome do arquivo corresponda depois de qualquer / (portanto, ele ainda será encontrado se estiver em um subdiretório no archive).

A correspondência de padrões em tar não é tão flexível quanto em find . Para o tipo de padrão que você descreve, você poderia filtrar o conteúdo completo por meio de grep :

tar -ztf ./foo_tar/bar.tar.gz | grep '\(^\|/\)baz[0-9]\+_'

Como você deseja salvar o resultado em uma variável, você também precisa colocar o comando usando Substituição de Comando :

filename_in_question=$(tar -ztf ./foo_tar/bar.tar.gz | grep '\(^\|/\)baz[0-9]\+_')

Isso ainda seria necessário se você estivesse usando find .

    
por 09.02.2018 / 12:14
0

Você precisa de uma implementação de tar com libfind :

star -t -f ./foo_tar/bar.tar.gz -find -name 'baz*'

funcionará como você espera e pode para muito mais.

Verifique a bola tar do schilytools: link

star é a implementação de taragem livre mais antiga. Veja a página Man:

link

    
por 31.05.2018 / 12:19