arquivos tar apenas, sem diretórios

16

Eu provavelmente posso escrever um shell script para encontrar apenas arquivos, então passar a lista para o tar, mas eu estou querendo saber se já existe um recurso embutido no tar que permite fazer exatamente isso, em uma única linha de comando? / p>

Por exemplo, encontrei a opção --no-recursion , mas quando faço isso:

tar --no-recursion -cvf mydir.tar mydir

Ele apenas arquiva os nomes das entradas no diretório (incluindo os subdiretórios!), mas não arquiva nenhum arquivo.

Eu também tentei:

 tar --no-recursion -cvf mydir.tar mydir/*

Mas enquanto ele arquiva apenas arquivos, ele também arquiva os nomes dos subdiretórios.

Existe uma maneira de informar apenas arquivos tar, sem diretórios?

    
por ateiob 18.11.2011 / 15:39

8 respostas

11

Como o camh aponta, o comando anterior tinha um pequeno problema, dado que muitos nomes de arquivo, ele seria executado mais de uma vez, com invocações posteriores limpando silenciosamente as execuções anteriores. Como não estamos compactando também, podemos acrescentar em vez de substituir:

find mydir -maxdepth 1 -type f -print0 | xargs -0 tar Avf mydir.tar
find mydir -maxdepth 1 -type f -exec tar Avf mydir.tar {} +

A resposta da Iocnarz de usar as opções tar --null e -T também funciona. Se você tem cpio instalado, a resposta da camh usando também está bem. E se você tiver zsh e não se importar em usá-lo para um comando, a resposta de Gilles usando um zsh glob ( *(.) ) parece o mais simples.

A chave era a opção -maxdepth . Resposta final, lidando adequadamente com os espaços:

find mydir -maxdepth 1 -type f -print0 | xargs -0 tar cvf mydir.tar

Isso também deve funcionar:

find mydir -maxdepth 1 -type f -exec tar cvf mydir.tar {} +
    
por 18.11.2011 / 16:55
13

Quando você quiser usar find com tar , a melhor maneira é usar cpio em vez de tar . cpio pode gravar arquivos tar e é projetado para pegar a lista de arquivos para arquivar a partir de stdin.

find mydir -type f -maxdepth 1 -print0 | cpio -o -H ustar -0 > mydir.tar

Usar find e cpio é uma abordagem mais unix-y, em que você deixa find fazer a seleção de arquivos com todo o poder que possui, e deixa cpio fazer o arquivamento. Vale a pena aprender esse uso simples de cpio , pois você acha fácil resolver problemas contra os quais você está à frente ao tentar tar .

    
por 07.04.2012 / 00:36
3

Não sei se entendi seus requisitos. Se você deseja armazenar os arquivos regulares em mydir , mas não em seus subdiretórios, a maneira mais fácil é usar zsh, em que apenas arquivos regulares correspondentes são a simples questão de usar o . Qualificador glob :

tar cf mydir.tar mydir/*(.)
    
por 19.11.2011 / 02:12
3

Você pode até usar find ... -print0 e tar ... --null diretamente sem usar xargs .

find . -maxdepth 1 -type f -print0 | tar cvf mydir.tar --null -T -

No exemplo dado, a opção --no-recursion para tar não é necessária porque apenas os caminhos dos arquivos (e não dos diretórios) serão passados de find para tar .

No entanto, usar a opção --no-recursion para tar no exemplo a seguir evita tar dos diretórios de arquivamento duplo. find fará a recursão da árvore de diretórios em vez de tar .

# compare
find . -print0 | tar cf mydir.tar --null -T -
tar -tf mydir.tar | nl

find . -print0 | tar cf mydir.tar --null --no-recursion -T -
tar -tf mydir.tar | nl
    
por 08.03.2012 / 18:37
2

Como o parágrafo introdutório em man tar diz (última frase),

The use of a directory name always implies that the subdirectories below should be included in the archive.

Que eu entendo como uma resposta "não" à sua pergunta.

    
por 18.11.2011 / 15:52
1
star -c -C startdir -find . ! -type d > out.tar

Omit -C startdir e substitua . por startdir se ele aparecer no arquivo.

Este é o método mais eficiente baseado nos recursos do libfind. O Libfind também oferece as primárias -chown -chgrp -chmod que modificam a estrutura da estatística e permitem arquivar diferentes metadados. Isso também funciona no modo de lista e extração e evita a necessidade de extrair todo o arquivo em muitos casos.

    
por 25.08.2015 / 13:22
0

Eu poderia ter encontrado uma solução.

find mydir -type f -printf '%P%code%'|tar czvf mydir.tar.gz -C mydir --null -T -

Isso pode ser um pouco caro, mas, de qualquer forma, funcionará, porque isso não depende de xargs.

    
por 25.08.2015 / 07:15
-1

dir = your_dir; cd $ dir; tar -cvf file.tar 'find. -maxdepth 1 -type f -print '

    
por 19.09.2017 / 23:46

Tags