tar -C com um padrão de arquivo curinga


17

Posso usar o comando tar para alterar diretórios e usar um padrão de arquivo curinga?

Aqui está o que estou tentando fazer:

tar -cf example.tar -C /path/to/file *.xml

Funciona se eu não alterar o diretório (-C), mas estou tentando evitar caminhos absolutos no arquivo tar.

tar -cf example.tar /path/to/file/*.xml

Aqui estão algumas das outras tentativas que eu fiz:

tar -cf example.tar -C /path/to/file *.xml
tar -cf example.tar -C /path/to/file/ *.xml
tar -cf example.tar -C /path/to/file/ ./*.xml
tar -cf example.tar -C /path/to/file "*.xml"

E este é o erro que recebo:

tar: *.xml: Cannot stat: No such file or directory

Eu sei que existem outras maneiras de fazer isso funcionar (usando find, xargs etc.), mas eu esperava fazer isso apenas com o comando tar.

Alguma ideia?

Respostas:


18

O problema é que o * .xml é interpretado pelo shell, não pelo tar. Portanto, os arquivos xml encontrados (se houver) estão no diretório em que você executou o comando tar

Você precisaria usar uma operação de vários estágios (talvez envolvendo pipes) para selecionar os arquivos desejados e tar.

A maneira mais fácil seria cdentrar no diretório em que os arquivos estão:

$ (cd /path/to/file && tar -cf /path/to/example.tar *.xml)

Deveria trabalhar.

Os colchetes agrupam os comandos, portanto, quando eles terminarem, você ainda estará no diretório original. O && significa que a tarexecução só será executada se a inicial cdfor bem-sucedida.


9

Em uma de suas tentativas:

tar -cf example.tar -C /path/to/file "*.xml"

o caractere * é realmente passado para o alcatrão. O problema, no entanto, é que o tar suporta apenas a correspondência curinga nos nomes dos membros de um arquivo. Portanto, embora você possa usar caracteres curinga ao extrair ou listar membros de um arquivo morto, não poderá usar caracteres curinga ao criar um arquivo morto.

Em tais situações, muitas vezes eu recorro a encontrar (como você já mencionou). Se você encontrar o GNU, ele tem a boa opção para imprimir apenas o caminho relativo, usando a opção -printf:

find '/path/to/file' -maxdepth 1 -name '*.xml' -printf '%P\0' \
| tar --null -C '/path/to/file' --files-from=- -cf 'example.tar'
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.