Provavelmente posso escrever um script de shell para encontrar apenas arquivos e passar a lista para tar, mas estou me perguntando se já existe um recurso interno no tar que permita fazer exatamente isso, em uma única linha de comando?
Por exemplo, encontrei a --no-recursion
opção, mas quando o faço:
tar --no-recursion -cvf mydir.tar mydir
Ele apenas arquiva os nomes das entradas no diretório (incluindo subdiretórios!), Mas não arquiva nenhum arquivo.
Eu também tentei:
tar --no-recursion -cvf mydir.tar mydir/*
Mas, embora arquive apenas arquivos, também arquiva os nomes dos subdiretórios.
Existe uma maneira de dizer apenas arquivos tar, sem diretórios?
find mydir -type f |xargs cp -t tempdir
e, em seguida, tar tempdir.find mydir -depth 1 -type f | xargs tar cf mydir.tar
find mydir -maxdepth 1 -type f -exec tar cvf mydir.tar {} +
. Os+
puts todos os arquivos na mesma linha de comando como xargs.Respostas:
Camh ressalta que o comando anterior apresentava um pequeno problema, dado que muitos nomes de arquivos eram executados mais de uma vez, com invocações posteriores eliminando silenciosamente as execuções anteriores. Como não estamos compactando também, podemos acrescentar em vez de substituir:
A resposta de Iocnarz de usar
tar
's'--null
e-T
opções também funciona. Se vocêcpio
instalou, a resposta do camh também é boa. E se você temzsh
e não se importa de usá-lo para um comando, a resposta de Gilles usando um zsh glob (*(.)
) parece a mais direta.A chave era a
-maxdepth
opção. Resposta final, lidando com os espaços adequadamente:Isso também deve funcionar:
fonte
tar
. Ambosxargs
efind
com a+
variante têm um número máximo de argumentos que podem ser passados para o tar. Isso resultará na segunda invocação do tar, substituindo a saída da primeira.-x
para forçar o xargs a falhar em vez de perder dados e, embora seja melhor que um bug silencioso de perda de dados, ainda não é o ideal. Esse bug de classificação é tão perigoso porque tudo parece bem no início, mas à medida que a lista de arquivos aumenta com o tempo, você começa a acioná-lo e pode não perceber até tentar restaurar o backup. Então é tarde demais.Quando você quiser usar
find
comtar
, a melhor maneira é usarcpio
em vez detar
.cpio
pode gravar arquivos tar e foi projetado para levar a lista de arquivos a serem armazenados no stdin.Usando
find
ecpio
é uma abordagem mais unix-y, na medida em que você deixafind
a seleção de arquivos com todo o poder que ela tem e deixacpio
fazer o arquivamento. Vale a pena aprender esse uso simplescpio
, pois você acha fácil resolver problemas com os quais se esforça ao tentartar
.fonte
-maxdepth
antes-type
.Não sei se entendi seus requisitos. Se você deseja armazenar os arquivos regulares em
mydir
seus subdiretórios, mas não em seus subdiretórios, a maneira mais fácil é usar o zsh, onde a correspondência de arquivos regulares é apenas uma questão simples de usar o.
qualificador global :fonte
Você pode até usar
find ... -print0
etar ... --null
diretamente sem usarxargs
.No exemplo dado, a
--no-recursion
opção totar
não é necessária porque apenas os caminhos dos arquivos (e não os diretórios) serão transmitidos defind
paratar
.Usar a
--no-recursion
opçãotar
no exemplo a seguir, no entanto, impede atar
duplicação de diretórios de arquivamento.find
fará a recursão da árvore de diretórios em veztar
disso.fonte
Como o parágrafo introdutório
man tar
diz (última frase),Que entendo como uma resposta "não" à sua pergunta.
fonte
--no-recursion
,--exclude-tag
, etc.). Estou olhando para o--exclude-tag
que parece promissor, mas parece ser exatamente o oposto do que estou procurando.Omitir
-C startdir
e substituir.
porstartdir
se ele aparecer no arquivo morto.Este é o método mais eficiente baseado nos recursos do libfind. O Libfind também oferece primárias
-chown
-chgrp
-chmod
que modificam o stat de estrutura e permitem arquivar diferentes metadados. Isso também funciona no modo de lista e extração e evita a necessidade de extrair o arquivo inteiro em muitos casos.fonte
-find
no-copy
modo A sinopse da página de manual sugere que você pode, mas não consegui fazê-lo funcionar (enquanto tentava responder Como copiar arquivos modificados, preservando a estrutura de pastas ) (com schily-2016-02-10)star -find
.Eu poderia ter encontrado uma solução.
find mydir -type f -printf '%P\0'|tar czvf mydir.tar.gz -C mydir --null -T -
Isso pode custar um pouco, mas de qualquer maneira funcionará, porque isso não depende do xargs.
fonte
dir = seu_dir; cd $ dir; tar -cvf file.tar `find. -maxdepth 1 -type f -print`
fonte