arquivos .tar sem estrutura de diretório

32

Estou .taring alguns arquivos com o caminho example/super_user/Output.*.

O resultado .taré assim:

+ example
    + super_user
          - Output.zip
          - Output.xml
          - Output.txt

Mas quero que o arquivo seja o seguinte:

- Output.zip
- Output.xml
- Output.txt

Você sabe como eu posso conseguir isso enquanto ainda estou em outro diretório?

Der Hochstapler
fonte
Evite tarbombs com arquivos como esse.
grawity
tar --strip-components = 1000?
Zaar Hai

Respostas:

11

O tar preservará a estrutura de arquivos e pastas, então não acho que exista nenhuma maneira de instruir o tar a nivelar a hierarquia no momento da criação.

Uma solução alternativa é alterar temporariamente o diretório, criar o tar e depois voltar - um rápido exemplo abaixo:

cd example/super_user && tar -cvf ../../result.tar Output.* && cd ../..
Gaff
fonte
27

Se o diretório 'exemplo' estiver na raiz do sistema de arquivos, aqui está outra maneira:

tar -C /example/super_user -cvf result.tar .

isso mudará o diretório para o ponto em que você deseja fazer o tar. A ressalva é que, se houver subdiretórios em / example / super_user, a estrutura de diretórios será preservada para esses subdiretórios.

Anthony Walters
fonte
11
Esta é a resposta para o problema em questão. A ressalva mencionada não é um problema neste caso. Todas as outras respostas são soluções alternativas para explicar as variações do problema.
Joki
Essa é realmente a solução para esta pergunta. O diretório não precisa ser a raiz, supondo que a estrutura do diretório /home/u/foo/bar, trabalhando dir seja /home/b, tar -C foo/bar -cvf qiz.tar .funcione bem. Uma ressalva, porém, é que você não pode usar caracteres curinga, ou seja tar -C foo/bar -cvf qiz.tar *.log, tar -C foo/bar -cvf qiz.tar "*.log"ou tar -C foo/bar -cvf qiz.tar "foo/bar/*.log"não funcionará.
Brice
11
Deve-se observar que você pode usar -Cvárias vezes em um único tarcomando se precisar adicionar vários arquivos espalhados por vários diretórios, mas ainda assim desejar que o arquivo tar seja simples.
zero298 25/04
10

Eu postei minha resposta aqui:

https://stackoverflow.com/questions/13924856/unix-tar-do-not-preserve-directory-structure

repost (para pessoas com preguiça)


Isso é feio ... mas funciona ...

Eu tive esse mesmo problema, mas com várias pastas, eu só queria nivelar todos os arquivos. Você pode usar a opção "transformar" para passar uma expressão sed e ... funciona como esperado.

esta é a expressão:

's/.*\///g' (exclua tudo antes de '/')

Este é o comando final:

tar --transform 's/.*\///g' -zcvf tarballName.tgz */*/*.info

Alessio Valentini
fonte
7

Para criar um tar (ARCHIVE.tar) com todos os arquivos de um diretório (DIR), sem nenhuma informação de diretório pai (nem mesmo ./), você pode usar algo como:

find "DIR" -type f -printf "%f\n" | xargs tar cf ARCHIVE.tar -C "DIR"

Você pode brincar com o achado para limitar a profundidade, selecionar arquivos específicos e muitas outras coisas.

Boa sorte!

Paul Bhullar
fonte
Estou recebendo "find: -printf: primário ou operador desconhecido" no comando OSX find. Alguma dica?
TCB13
-printfé um comando não padrão. Muitos deles funcionam apenas com versões específicas do find. Normalmente marcamos aqueles ao responder a uma pergunta sobre Super User (por exemplo, com "-blah é uma extensão Gnu e não funcionará em todos os lugares").
Hennes
3

Eu criei um diretório temporário. E no diretório, criou links simbólicos para todos os arquivos para os arquivos a serem incluídos. Então eu fiz tar -h -C. para que todos os arquivos (não os links, mas o conteúdo) sejam incluídos no arquivo morto com o nome desejado.

mzwt
fonte
1

Se esse é o conteúdo completo do tarball, você pode usar a --strip-componentsopção GNU tar para remover os 2 níveis antes dos arquivos.

Ignacio Vazquez-Abrams
fonte
Eu só tenho a opção, --strip-pathmas usá-la não mudará nada.
1

Outra maneira de mudar o diretório temporariamente é colocar os comandos cde tarentre parênteses( ) :

(cd example/super_user; tar -cvf ../../result.tar *)

A vantagem disso é que você sempre retornará implicitamente ao diretório original quando o bloqueio estiver concluído. ou seja, não há necessidade de pushd.. popdbloquear ou acompanhar para onde cdvoltar.

Stephen Quan
fonte
0
pushd example/super_user
tar -cf output.tar Output.*
popd

pushd envia o caminho do diretório atual para a DIRpilha e passa para a pasta de conteúdo. Em seguida, você volta ao diretório original usando popd.

Saravana Kumar
fonte