Como removo o caminho completo ao fazer uma compactação tar.gz?

Como removo o caminho completo ao fazer uma compactação tar.gz?

Estou usando este comando para arquivar um diretório nomeado gno código Java:

tar czf /a/b/c.tar.gz /e/f/g

Quando o arquivo tar c.tar.gzé criado, encontro um caminho inteiro e/f/ge depois todos os arquivos da gpasta dentro dele. Mas só quero ver os arquivos da pasta gno arquivo compactado quando abri-lo. Como faço para remover as pastas /e/f/do arquivo .tar.gz?

Responder1

tar -czf /a/b/c.tar.gz -C /e/f/g .

A -Copção taraltera o diretório de trabalho, então você só precisa adicionar ..

Ver:Alterando o diretório de trabalho – tarmanual GNU

Responder2

Esta pergunta é de um tempo atrás, mas ainda não consegui encontrar a resposta facilmente para adicionar arquivos e pastas com critérios de pesquisa específicos com caminhos relativos.

O seguinte cobre um tópico mais amplo do que o que foi perguntado. Então, estou escrevendo a solução que encontrei após minha pesquisa.

Vamos supor que sua $input_dirvariável aponte para o diretório de seu interesse e você deseja tar e compactar (usando gzip) todos os seus *.txtarquivos em ~/my_txt.tar.gz. Para criar um tarball compactado sem nenhum caminho armazenado no tar (caminho relativo), use o seguinte:

find "$input_dir" -maxdepth 1 -type f -name "*.txt" -printf "%P\0" | tar --null --create --remove-files --gzip --file="$HOME/my_txt.tar.gz" --directory="$input_dir" --files-from=-

Vamos decompô-lo:

  • "$input_dir": O diretório do ponto inicial. Mude para o que quiser.
  • maxdepth 1: procura apenas na raiz desse diretório. Você pode removê-lo ou modificá-lo se quiser pesquisar todos ou níveis diferentes.
  • -type f: pesquisa apenas por arquivos
  • -name "*.txt": correspondendo aos critérios *.txt
  • -printf "%P": gera o Caminho Relativo (página de manual: "Nome do arquivo com o nome do ponto inicial sob o qual foi encontrado removido").
  • -printf "%P\0": null encerra as saídas do caminho relativo
  • | tar: canalize as saídas para o próximo comando que é tar aqui
  • --null: instrui --files-froma opção subsequente a ler nomes terminados em nulo. Lembre-se de que pedimos findpara criar \0saídas terminadas em nulo ( ) em vez de \nsaídas terminadas regularmente. Isto cobre todos os nomes de arquivos possíveis com espaços ou outros caracteres especiais.
  • --create: crie o arquivo tar. Igual a -c.
  • --remove-files: Eu uso esta opção para remover os arquivos depois que eles são adicionados ao tarball. Você pode abandoná-lo.
  • --gzip: gzip o tarball. Igual a -z.
  • --file="$HOME/my_txt.tar.gz": O arquivo tarball compactado de saída. Igual a-f "$HOME/my_txt.tar.gz"
  • --directory="$input_dir": Isso significa que taragora muda para este diretório. Agora ele irá procurar os nomes dos arquivos que são passados ​​neste diretório (lembre-se que fizemos o caminho relativo dos nomes dos arquivos para esta pasta). Igual a -C "$input_dir".
  • --files-from=/dev/stdin: Sua forma geral é --files-from=FILE. Esta opção com a --nullopção instrui tarque os nomes FILEsejam separados pelo caractere ASCII NULL, ao invés do Line Feed ( \n). Também dizemos que FILEis stdin(enviado finddiretamente para, tarem vez de ler de um FILEdisco). Igual a -T -.

Algumas das opções acima podem ser alteradas para opções de um caractere e podem ser combinadas.

find "$input_dir" -maxdepth 1 -type f -name "*.txt" -printf "%P\0" | tar --null --remove-files -czf "$HOME/my_txt.tar.gz" -C "$input_dir" -T -

Você pode verificar a lista de arquivos usando a opção -tou --list:

tar -tf "$HOME/my_txt.tar.gz"

Agora, para extrair os arquivos para o diretório $output_dir (que existe), use isto:

tar -xvzf "$HOME/my_txt.tar.gz" -C "$output_dir"

A vopção é detalhada e você também pode adicioná-la durante a criação do tarball.

Responder3

A resposta do slhck não permite filtrar quais arquivos queremos e inclui o diretório inteiro, e o globbing do shell não funcionará com esta opção de diretório (veja este problema descrito aqui:Como fazer o tar globbing funcionar com a opção 'alterar diretório').

A resposta shaheen g é ótima, mas bytes nulos me impediram de usar o comando em uma linguagem de programação porque bytes nulos são proibidos em uma string. Então eu adaptei para funcionar sem byte nulo quando você não precisa lidar com nomes de arquivos com espaços em branco, respondaaqui.

tar -czf /a/b/c.tar.gz -C /e/f/g $(find /e/f/g -maxdepth 1 -type f -name "*.txt" -printf "%f\n")

ou

find /e/f/g -maxdepth 1 -type f -name "*.txt" -printf "%f\n" | tar -czf /a/b/c.tar.gz -C /e/f/g -T -

informação relacionada