Existe um comando / script simples do shell que suporta a exclusão de determinados arquivos / pastas do arquivamento?
Eu tenho um diretório que precisa ser arquivado com um subdiretório que possui vários arquivos muito grandes dos quais não preciso fazer backup.
Não são exatamente soluções:
O tar --exclude=PATTERN
comando corresponde ao padrão fornecido e exclui esses arquivos, mas preciso que arquivos e pastas específicos sejam ignorados (caminho completo do arquivo); caso contrário, arquivos válidos poderão ser excluídos.
Também poderia usar o comando find para criar uma lista de arquivos e excluir os que não quero arquivar e passar a lista para tar, mas isso só funciona com uma pequena quantidade de arquivos. Eu tenho dezenas de milhares.
Estou começando a pensar que a única solução é criar um arquivo com uma lista de arquivos / pastas a serem excluídos, depois usar o rsync with --exclude-from=file
para copiar todos os arquivos para um diretório tmp e, em seguida, usar o tar para arquivar esse diretório.
Alguém pode pensar em uma solução melhor / mais eficiente?
EDIT: A solução de Charles Ma funciona bem. O grande problema é que --exclude='./folder'
DEVE estar no início do comando tar. Comando completo (primeiro o cd, portanto, o backup é relativo a esse diretório):
cd /folder_to_backup
tar --exclude='./folder' --exclude='./upload/folder2' -zcvf /backup/filename.tgz .
--exclude
não precisa ser o primeiro, mas deve estar em algum lugar antes do diretório de origem (testado com tar 1.29 no Cygwin).Respostas:
Você pode ter várias opções de exclusão para o tar
etc vai funcionar. Faça certeza de colocar
--exclude
antes os itens de origem e de destino.fonte
tar -zcv --exclude='file1' --exclude='patter*' --exclude='file2' -f /backup/filename.tgz .
nota que as-f
necessidades bandeira para preceder o arquivo tar ver: superuser.com/a/559341/415047Você pode excluir diretórios com o
--exclude
tar.Se você deseja arquivar tudo, exceto
/usr
você pode usar:No seu caso, talvez algo como
fonte
Opções possíveis para excluir arquivos / diretórios do backup usando tar:
Excluir arquivos usando vários padrões
Excluir arquivos usando um arquivo de exclusão preenchido com uma lista de padrões
Excluir arquivos usando tags, colocando um arquivo de tags em qualquer diretório que deva ser ignorado
fonte
pergunta antiga com muitas respostas, mas achei que nenhuma era suficientemente clara para mim, então gostaria de adicionar minha tentativa.
se você tem a seguinte estrutura
com os seguintes arquivos / pastas
então, você deseja criar um arquivo tar que contenha tudo dentro de / home / ftp / mysite (para mover o site para um novo servidor), mas
file3
é apenas lixo, e tudofolder3
também não é necessário, então vamos pular esses dois.nós usamos o formato
onde c = create, z = zip ev = verbose (você pode ver os arquivos à medida que são inseridos, útil para garantir que nenhum dos arquivos excluídos esteja sendo adicionado). e f = arquivo.
então, meu comando ficaria assim
observe que os arquivos / pastas excluídos são relativamente à raiz do seu tar (tentei o caminho completo aqui em relação a / mas não consigo fazer esse trabalho).
espero que isso ajude alguém (e eu na próxima vez que pesquisar no google)
fonte
tar -czvf mysite.tar.gz mysite --exclude='./mysite/file3' --exclude='./mysite/folder3'
e isso não excluía nada.Você pode usar a "notação ant" padrão para excluir os diretórios relativos.
Isso funciona para mim e exclui qualquer diretório .git ou node_module:
myInputFile.txt contém:
/ dev2 / java
/ dev2 / javascript
fonte
globstar
tenha que estar ativada. Verifique comshopt -s globstar
. Eu acho que fora por padrão na maioria do sistema operacional baseado em UNIX. No manual do Bash: " globstar: Se definido, o padrão**
usado em um contexto de expansão de nome de arquivo corresponderá a todos os arquivos e zero ou mais diretórios e subdiretórios. Se o padrão for seguido por um '/', apenas diretórios e subdiretórios corresponderão. "Eu experimentei isso, pelo menos com a versão do tar Cygwin que estou usando ("CYGWIN_NT-5.1 1.7.17 (0.262 / 5/3) 19/10/2012 14:39 i686 Cygwin" em um Windows XP Home Edition Máquina SP3), a ordem das opções é importante.
Enquanto essa construção funcionou para mim:
aquele não funcionou:
Isso, embora
tar --help
revele o seguinte:Portanto, o segundo comando também deve funcionar, mas aparentemente não parece ser o caso ...
Best rgds,
fonte
Esse padrão de exclusão manipula o sufixo do nome do arquivo como png ou mp3, bem como nomes de diretório como .git e node_modules
fonte
Para aqueles que têm problemas com isso, algumas versões do tar funcionariam corretamente sem o './' no valor de exclusão.
Sintaxe de comando que funciona:
Estes não funcionarão:
fonte
Encontrei isso em outro lugar para não receber crédito, mas funcionou melhor do que qualquer uma das soluções acima para meus problemas específicos do mac (mesmo que isso esteja fechado):
fonte
COPYFILE_DISABLE=1
ao usar tar, caso contrário, você pode obter ._ arquivos em seu arquivo tarPara o Mac OSX, tive que fazer
tar -zcv --exclude='folder' -f theOutputTarFile.tar folderToTar
Observe o
-f
depois do--exclude=
fonte
Concordo que a bandeira --exclude é a abordagem correta.
Uma palavra de advertência para um efeito colateral que não achei imediatamente óbvio: A exclusão de 'fileA' neste exemplo procurará 'fileA' RECURSIVELY!
Exemplo: Um diretório com um único subdiretório contendo um arquivo com o mesmo nome (data.txt)
Se estiver usando
--exclude='data.txt'
o arquivo não irá conter SEJA data.txt arquivo. Isso pode causar resultados inesperados ao arquivar bibliotecas de terceiros, como um diretório node_modules.Para evitar esse problema, certifique-se de fornecer o caminho inteiro, como
--exclude='./dirA/data.txt'
fonte
Para evitar possíveis
'xargs: Argument list too long'
erros devido ao uso defind ... | xargs ...
ao processar dezenas de milhares de arquivos, você pode canalizar a saídafind
diretamente para otar
usofind ... -print0 | tar --null ...
.fonte
xargs -n 1
é outra opção para evitarxargs: Argument list too long
erros;)Depois de ler este tópico, fiz um pequeno teste no RHEL 5 e aqui estão meus resultados para classificar o diretório abc:
Isso excluirá o erro e os logs dos diretórios e todos os arquivos nos diretórios:
Adicionar um curinga após o diretório excluído excluirá os arquivos, mas preservará os diretórios:
fonte
Use o comando find em conjunto com a opção tar append (-r). Dessa forma, você pode adicionar arquivos a um tar existente em uma única etapa, em vez de uma solução de duas passagens (criar lista de arquivos, criar tar).
fonte
Você também pode usar uma das opções "--exclude-tag", dependendo de suas necessidades:
A pasta que hospeda o arquivo especificado será excluída.
fonte
Depois de ler todas essas boas respostas para diferentes versões e ter resolvido o problema por mim, acho que existem pequenos detalhes que são muito importantes e raros para o uso geral do GNU / Linux , que não são estressados o suficiente e merecem mais do que comentários.
Portanto, não vou tentar responder à pergunta para todos os casos, mas, em vez disso, tente registrar onde procurar quando as coisas não funcionarem.
É MUITO IMPORTANTE AVISO:
No meu caso, para o GNU tar 1.29 no Debian, o comando que funcionou foi
As citações não importavam, funcionavam com ou sem elas.
Espero que isso seja útil para alguém.
fonte
Você pode usar o cpio (1) para criar arquivos tar. O cpio leva os arquivos para arquivar no stdin, portanto, se você já descobriu o comando find que deseja usar para selecionar os arquivos do archive, coloque-o no cpio para criar o arquivo tar:
fonte
gnu tar v 1.26 o --exclude precisa vir após os argumentos do arquivo morto e do diretório de backup, não deve ter barras à esquerda ou à direita e prefere sem aspas (simples ou dupla). Portanto, em relação ao diretório PARENT a ser copiado, é:
tar cvfz /path_to/mytar.tgz ./dir_to_backup --exclude=some_path/to_exclude
fonte
tar (GNU tar) 1.28
.-X indica um arquivo que contém uma lista de nomes de arquivos que devem ser excluídos do backup. Por exemplo, você pode especificar * ~ neste arquivo para não incluir nomes de arquivos que terminem com ~ no backup.
fonte
tar cXvfJ EXCLUDE-LIST ARCHIVE.tar.xz SOURCE-FOLDER
Sua melhor aposta é usar find com tar, via xargs (para lidar com o grande número de argumentos). Por exemplo:
fonte
find / -print0 | tar -T- --null --no-recursive -cjf tarfile.tar.bz2
xargs
, deve-se usar ar
opção tar em vez de,c
quando,find
na verdade, encontrar muitos resultados, o xargs dividirá esses resultados (com base no limite de argumentos da linha de comando local) em pedaços e invocará o tar em cada parte. Isso resultará em um arquivo contendo o último chunck retornado porxargs
e nem todos os resultados encontrados pelofind
comando.Possível resposta redundante, mas desde que eu achei útil, aqui está:
Enquanto uma raiz do FreeBSD (ou seja, usando csh), eu queria copiar todo o meu sistema de arquivos raiz para / mnt, mas sem / usr e (obviamente) / mnt. Isto é o que funcionou (estou em /):
Meu argumento principal é que era necessário (colocando o ./ ) especificar para tar que os diretórios excluídos eram parte do diretório maior sendo copiado.
Meu € 0,02
fonte
Não tive sorte em obter tar para excluir um subdiretório de 5 Gigabytes com alguns níveis de profundidade. No final, eu apenas usei o comando Zip unix. Funcionou muito mais fácil para mim.
Portanto, para este exemplo específico da postagem original
(tar --exclude = '. / Folder' --exclude = '. / Upload / folder2' -zcvf /backup/filename.tgz.)
O equivalente seria:
(NOTA: Aqui está a postagem que usei originalmente que me ajudou a /superuser/312301/unix-zip-directory-but-excluded-specific-subdirectories-and-everything-within-t )
fonte
zip
não empacota diretórios vazios, mastar
sim!Confira
fonte
Quero ter uma nova versão front-end (pasta angular) no host local. Além disso, a pasta git é enorme no meu caso, e quero excluí-la. Preciso baixá-lo do servidor e descompactá-lo para executar o aplicativo.
Comprima a pasta angular de / var / lib / tomcat7 / webapps, mova-a para a pasta / tmp com o nome angular.23.12.19.tar.gz
Comando:
fonte
Caso de sucesso: 1) se estiver fornecendo o caminho completo para o backup, em excluir também deve ser usado o caminho completo.
tar -zcvf /opt/ABC/BKP_27032020/backup_27032020.tar.gz --exclude = '/ opt / ABC / csv / ' --exclude = '/ opt / ABC / log / ' / opt / ABC
2) se ao fornecer o caminho atual para o backup, em excluir também deve ser usado apenas o caminho atual.
tar -zcvf backup_27032020.tar.gz --exclude = 'ABC / csv / ' --exclude = 'ABC / log / ' ABC
Caso de falha:
se estiver fornecendo o diretório currentpath para fazer backup e o caminho completo para ignorar, não funcionará
tar -zcvf /opt/ABC/BKP_27032020/backup_27032020.tar.gz --exclude = '/ opt / ABC / csv / ' --exclude = '/ opt / ABC / log / ' ABC
Nota: mencionar excluir antes / depois do diretório de backup está correto.
fonte
Se você está tentando excluir arquivos do VCS (Version Control System), o tar já suporta duas opções interessantes! :)
Isto exclui opção arquivos e diretórios usados seguindo sistemas de controle de versão:
CVS
,RCS
,SCCS
,SVN
,Arch
,Bazaar
,Mercurial
, eDarcs
.A partir da versão 1.32, os seguintes arquivos são excluídos:
CVS/
e tudo sob eleRCS/
e tudo sob eleSCCS/
e tudo sob ele.git/
e tudo sob ele.gitignore
.gitmodules
.gitattributes
.cvsignore
.svn/
e tudo sob ele.arch-ids/
e tudo sob ele{arch}/
e tudo sob ele=RELEASE-ID
=meta-update
=update
.bzr
.bzrignore
.bzrtags
.hg
.hgignore
.hgrags
_darcs
Ao arquivar diretórios que estão sob algum sistema de controle de versão (VCS), muitas vezes é conveniente para ler padrões de exclusão deste VCS' ignorar arquivos (por exemplo
.cvsignore
,.gitignore
, etc.) Esta opção fornecer tal possibilidade.Antes de arquivar um diretório, ver se ele contém qualquer um dos seguintes arquivos:
cvsignore
,.gitignore
,.bzrignore
, ou.hgignore
. Nesse caso, leia ignorar padrões desses arquivos.Os padrões são tratados da mesma maneira que o VCS correspondente os trataria, ou seja:
.cvsignore
Contém padrões de globbing no estilo de shell que se aplicam somente ao diretório em que esse arquivo reside. Nenhum comentário é permitido no arquivo. Linhas vazias são ignoradas.
.gitignore
Contém padrões de globbing no estilo de casca. Aplica-se ao diretório em que
.gitfile
está localizado e a todos os seus subdiretórios.Qualquer linha que comece com a
#
é um comentário. A barra invertida escapa o caractere de comentário..bzrignore
Contém padrões de globbing de shell e expressões regulares (se prefixadas com
RE:
(16). Os padrões afetam o diretório e todos os seus subdiretórios.Qualquer linha que comece com a
#
é um comentário..hgignore
Contém expressões regulares posix (17). A linha
syntax: glob
muda para padrões de globbing shell. A linhasyntax: regexp
volta. Os comentários começam com a#
. Os padrões afetam o diretório e todos os seus subdiretórios.tar -czv --exclude-vcs --exclude-vcs-ignores -f path/to/my-tar-file.tar.gz path/to/my/project/
fonte
O script bash a seguir deve fazer o truque. Ele usa a resposta dada aqui por Marcus Sundman.
Isso imprimirá o comando necessário e você poderá copiá-lo e colá-lo novamente. Provavelmente, existe uma maneira mais elegante de fornecê-lo diretamente à linha de comando.
Basta alterar * .CC para qualquer outra extensão comum, nome de arquivo ou regex que você deseja excluir e isso ainda funcionará.
EDITAR
Apenas para adicionar uma pequena explicação; find gera uma lista de arquivos que correspondem ao regex escolhido (neste caso, * .CC). Essa lista é passada via xargs para o comando echo. Isso imprime - exclua 'uma entrada da lista'. As barras () são caracteres de escape para as marcas '.
fonte