
Estou usando este comando para arquivar um diretório nomeado g
no 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/g
e depois todos os arquivos da g
pasta dentro dele. Mas só quero ver os arquivos da pasta g
no 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 -C
opção tar
altera o diretório de trabalho, então você só precisa adicionar .
.
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_dir
variável aponte para o diretório de seu interesse e você deseja tar e compactar (usando gzip) todos os seus *.txt
arquivos 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-from
a opção subsequente a ler nomes terminados em nulo. Lembre-se de que pedimosfind
para criar\0
saídas terminadas em nulo ( ) em vez de\n
saí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 quetar
agora 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--null
opção instruitar
que os nomesFILE
sejam separados pelo caractere ASCII NULL, ao invés do Line Feed (\n
). Também dizemos queFILE
isstdin
(enviadofind
diretamente para,tar
em vez de ler de umFILE
disco). 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 -t
ou --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 v
opçã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 -