tar -C com um padrão de arquivo curinga

15

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 mudar de 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 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 idéia?

    
por Nick C. 04.04.2011 / 16:10

2 respostas

16

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

Você teria que usar uma operação de várias etapas (talvez envolvendo pipes) para selecionar os arquivos desejados e depois tará-los.

A maneira mais fácil seria apenas cd no diretório onde os arquivos estão:

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

deve funcionar.

Os colchetes agrupam os comandos juntos, então, quando terminarem, você ainda estará no diretório original. O & & significa que o tar será executado somente se o cd inicial for bem-sucedido.

    
por 04.04.2011 / 16:22
7

Em uma de suas tentativas:

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

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

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

find '/path/to/file' -maxdepth 1 -name '*.xml' -printf '%P
tar -cf example.tar -C /path/to/file "*.xml"
' \ | tar --null -C '/path/to/file' --files-from=- -cf 'example.tar'
    
por 24.07.2014 / 09:47

Tags