Pergunta

Existe um simples shell de comando / script que suporta a exclusão de certos arquivos / pastas de ser arquivados?

Eu tenho um diretório que precisam ser arquivados com um sub-diretório que tem um número de arquivos muito grandes que não precisam de backup.

Não é bem assim soluções:

O comando tar --exclude=PATTERN corresponde ao padrão determinado e exclui esses arquivos, mas eu preciso de arquivos e pastas específicos para ser ignorado (caminho do arquivo completo), caso contrário arquivos válidos pode ser excluída.

Eu também poderia usar o comando find para criar uma lista de arquivos e excluir os que não querem arquivar e passar a lista de alcatrão, mas que só funciona com uma pequena quantidade de arquivos. Eu tenho dezenas de milhares.

Eu estou começando a pensar que a única solução é criar um arquivo com uma lista de arquivos / pastas a serem excluídos, em seguida, usar o rsync com --exclude-from=file para copiar todos os arquivos para um diretório tmp, e depois use tar para arquivar que diretório.

Alguém pode pensar em uma solução melhor / mais eficiente?

EDIT: Charles Ma 's solução funciona bem. A grande pegadinha é que a --exclude='./folder' deve estar no início do comando tar. comando completo (cd primeiro lugar, para backup é relativa a esse diretório):

cd /folder_to_backup
tar --exclude='./folder' --exclude='./upload/folder2' -zcvf /backup/filename.tgz .
Foi útil?

Solução

Você pode ter múltiplos excluir opções para tar assim

$ tar --exclude='./folder' --exclude='./upload/folder2' -zcvf /backup/filename.tgz .

etc vai funcionar. Marca certeza para colocar --exclude antes a fonte e itens de destino.

Outras dicas

Você pode excluir diretórios com --exclude de alcatrão.

Se você quiser arquivar tudo, exceto /usr você pode usar:

tar -zcvf /all.tgz / --exclude=/usr

No seu caso, talvez algo como

tar -zcvf archive.tgz arc_dir --exclude=dir/ignore_this_dir

As opções possíveis para excluir arquivos / diretórios de backup usando tar:

Excluir arquivos usando vários padrões

tar -czf backup.tar.gz --exclude=PATTERN1 --exclude=PATTERN2 ... /path/to/backup

Excluir arquivos usando um arquivo preenchido com uma lista de padrões de excluir

tar -czf backup.tar.gz -X /path/to/exclude.txt /path/to/backup

Excluir arquivos usando tags, colocando um arquivo de tag em qualquer diretório que deve ser ignorada

tar -czf backup.tar.gz --exclude-tag-all=exclude.tag /path/to/backup

velha pergunta com muitas respostas, mas eu achei que nenhuma foi bastante claro o suficiente para mim, então eu gostaria de acrescentar a minha tentativa.

Se você tem a seguinte estrutura

/home/ftp/mysite/

com os seguintes arquivos / pastas

/home/ftp/mysite/file1
/home/ftp/mysite/file2
/home/ftp/mysite/file3
/home/ftp/mysite/folder1
/home/ftp/mysite/folder2
/home/ftp/mysite/folder3

Então, você quer fazer um arquivo tar que contêm everyting dentro / home / ftp / mysite (para mover o site para um novo servidor), mas file3 é apenas lixo, e também não é necessário tudo em folder3, então nós ignorará aqueles dois.

nós usamos o formato

tar -czvf <name of tar file> <what to tar> <any excludes>

onde os c = criar, z = zip, e v = verbose (você pode ver os arquivos como eles são inseridos, útil para se certificar de que nenhum dos arquivos que você excluir estão sendo adicionados). e f = arquivo.

Então, meu comando ficaria assim

cd /home/ftp/
tar -czvf mysite.tar.gz mysite --exclude='file3' --exclude='folder3'

Observe os arquivos / pastas excluídos são relativamente à raiz do seu tar (Eu tentei caminho completo aqui em relação a / mas eu não posso fazer esse trabalho).

espero que isso vai ajudar alguém (e me próxima vez que eu google)

Você pode usar o padrão "notação formiga" para excluir diretórios relativos.
Isso funciona para mim e exclui qualquer .git ou node_module diretórios.

tar -cvf myFile.tar --exclude=**/.git/* --exclude=**/node_modules/*  -T /data/txt/myInputFile.txt 2> /data/txt/myTarLogFile.txt

myInputFile.txt Contém:

/ Dev2 / java
/ Dev2 / javascript

Eu experimentei que, pelo menos com o Cygwin versão do tar que estou usando ( "CYGWIN_NT-5,1 1.7.17 (0,262 / 5/3) 2012-10-19 14: 39 i686 Cygwin" em uma máquina Windows XP Home Edition SP3), a ordem de opções é importante.

Embora esta construção funcionou para mim:

tar cfvz target.tgz --exclude='<dir1>' --exclude='<dir2>' target_dir

que um não trabalho:

tar cfvz --exclude='<dir1>' --exclude='<dir2>' target.tgz target_dir

Este, enquanto tar --help revela o seguinte:

tar [OPTION...] [FILE]

Assim, o segundo comando também deve funcionar, mas, aparentemente, não parece ser o caso ...

Melhores rgds,

Esta excluir alças padrão sufixo nome de arquivo como PNG ou mp3, bem como nomes de diretório como .git e node_modules

tar --exclude={*.png,*.mp3,*.wav,.git,node_modules} -Jcf ${target_tarball}  ${source_dirname}

Eu encontrei este em outro lugar por isso não vou levar o crédito, mas funcionou melhor do que qualquer das soluções acima de meus problemas mac específicos (mesmo que este é fechado):

tar zc --exclude __MACOSX --exclude .DS_Store -f <archive> <source(s)>

Para aqueles que têm problemas com ele, algumas versões do tar só iria funcionar corretamente sem o './' no valor de exclusão.

Tar --version

tar (tar GNU) 1.27.1

sintaxe de comando que o trabalho:

tar -czvf ../allfiles-butsome.tar.gz * --exclude=acme/foo

Estes não vai funcionar:

$ tar -czvf ../allfiles-butsome.tar.gz * --exclude=./acme/foo
$ tar -czvf ../allfiles-butsome.tar.gz * --exclude='./acme/foo'
$ tar --exclude=./acme/foo -czvf ../allfiles-butsome.tar.gz *
$ tar --exclude='./acme/foo' -czvf ../allfiles-butsome.tar.gz *
$ tar -czvf ../allfiles-butsome.tar.gz * --exclude=/full/path/acme/foo
$ tar -czvf ../allfiles-butsome.tar.gz * --exclude='/full/path/acme/foo'
$ tar --exclude=/full/path/acme/foo -czvf ../allfiles-butsome.tar.gz *
$ tar --exclude='/full/path/acme/foo' -czvf ../allfiles-butsome.tar.gz *

Para Mac OSX eu tinha que fazer

tar -zcv --exclude='folder' -f theOutputTarFile.tar folderToTar

Observe o -f após a --exclude=

Eu concordo a bandeira --exclude é a abordagem correta.

$ tar --exclude='./folder_or_file' --exclude='file_pattern' --exclude='fileA'

Uma palavra de aviso para um efeito colateral que eu não encontrar imediatamente óbvio: A exclusão de 'fileA' neste exemplo irá procurar por 'fileA' recursivamente!

Exemplo: Um directório com um único subdirectório contendo um ficheiro com o mesmo nome (dados.txt)

data.txt
config.txt
--+dirA
  |  data.txt
  |  config.docx
  • Se estiver usando --exclude='data.txt' o arquivo não irá conter QUER data.txt arquivo. Isso pode causar resultados inesperados se o arquivamento de bibliotecas de terceiros, tais como um diretório node_modules.

  • Para evitar esse problema certifique-se de dar o caminho inteiro, como --exclude='./dirA/data.txt'

Para evitar possíveis erros 'xargs: Argument list too long' devido ao uso de find ... | xargs ... ao processar dezenas de milhares de arquivos, você pode canalizar a saída do find diretamente para tar usando find ... -print0 | tar --null ....

# archive a given directory, but exclude various files & directories 
# specified by their full file paths
find "$(pwd -P)" -type d \( -path '/path/to/dir1' -or -path '/path/to/dir2' \) -prune \
   -or -not \( -path '/path/to/file1' -or -path '/path/to/file2' \) -print0 | 
   gnutar --null --no-recursion -czf archive.tar.gz --files-from -
   #bsdtar --null -n -czf archive.tar.gz -T -

Depois de ler esta discussão, eu fiz um pequeno teste no RHEL 5 e aqui estão meus resultados para asfaltamento até o diretório abc:

Isto irá excluir o erro e logs de diretórios e todos os arquivos sob os diretórios:

tar cvpzf abc.tgz abc/ --exclude='abc/error' --exclude='abc/logs'

Adicionando um curinga após o diretório excluídos irá excluir os arquivos, mas preservar os diretórios:

tar cvpzf abc.tgz abc/ --exclude='abc/error/*' --exclude='abc/logs/*'

Use o comando find em conjunto com a opção tar append (-r). Desta forma, você pode adicionar arquivos para um tar existente em uma única etapa, em vez de uma solução de dois pass (lista de arquivos criar, criar tar).

find /dir/dir -prune ... -o etc etc.... -exec tar rvf ~/tarfile.tar {} \;

Você também pode usar uma das opções "--exclude-tag" dependendo de suas necessidades:

  • - excluem-tag = ARQUIVO
  • - excluem-tag-all = ARQUIVO
  • - excluem-tag-under = ARQUIVO

Serão excluídos A pasta que hospeda o arquivo especificado.

Você pode usar cpio (1) para criar arquivos tar. cpio leva os arquivos para arquivo em stdin, então se você já descobriu o comando find que deseja usar para selecionar os arquivos do arquivo, canalizá-lo em cpio para criar o arquivo tar:

find ... | cpio -o -H ustar | gzip -c > archive.tar.gz

gnu tar v 1,26 necessidades --exclude para vir atrás de argumentos de ficheiros de arquivo e diretório de backup, não deve ter nenhum esquerda ou à direita barras, e prefere sem aspas (simples ou duplas). Assim, em relação ao diretório pai para o backup, é:

tar cvfz /path_to/mytar.tgz ./dir_to_backup --exclude=some_path/to_exclude

Depois de ler todos este boas respostas para as versões diferentes e ter resolvido o problema para mim, eu acho que lá são muito pequenos detalhes que são muito importantes, e raro para uso geral GNU / Linux , que Aren 't salientado o suficiente e merece mais do que comentários.

Então, eu não vou tentar responder a pergunta para cada caso, mas em vez disso, tentar registrar onde procurar quando as coisas não funciona.

É muito importante notar:

  1. A ordem das opções ASSUNTO: não é o mesmo colocar o --exclude antes do que após a opção de arquivos e diretórios para backup. Isto é inesperado, pelo menos para mim, porque na minha experiência, em comandos GNU / Linux, normalmente a ordem das opções não importa.
  2. Diferentes versões de alcatrão espera que esta opção em ordem diferente: , por exemplo, @ resposta de Andrew indica que no GNU tar v 1.26 e 1.28 a exclui vem por último, ao passo que no meu caso, com o GNU tar 1,29, é o outro lado.
  3. ao Trailing barras MATTER :. Pelo menos em GNU tar 1,29, não deve ser qualquer

No meu caso, para o GNU tar 1,29 no trecho Debian, o comando que trabalhava era

tar --exclude="/home/user/.config/chromium" --exclude="/home/user/.cache" -cf file.tar  /dir1/ /home/ /dir3/

As aspas não importa, ele trabalhou com ou sem eles.

Espero que isso será útil para alguém.

Sua melhor aposta é usar achado com tar, via xargs (para lidar com o grande número de argumentos). Por exemplo:

find / -print0 | xargs -0 tar cjf tarfile.tar.bz2
tar -cvzf destination_folder source_folder -X /home/folder/excludes.txt

-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 qualquer ficheiros que terminam em ~ no backup.

resposta redundante possível, mas desde que eu achei que seria útil, aqui está:

Enquanto uma raiz FreeBSD (ou seja, usando CSH) eu queria copiar toda a minha raiz sistema de arquivos para / mnt mas sem / usr e (obviamente) / mnt. Isto é o que funcionou (eu estou em /):

tar --exclude ./usr --exclude ./mnt --create --file - . (cd /mnt && tar xvd -)

A minha questão toda é que era necessário (por colocar o ./ ) para especificar para tar que os diretórios excluídos, onde parte do diretório maior a ser copiados.

Meu € 0,02

Eu não tinha sorte para conseguir tar para excluir um subdiretório 5 Gigabyte alguns níveis de profundidade. No final, eu usei apenas o comando unix Zip. Funcionou muito mais fácil para mim.

Portanto, para este exemplo particular do post original
(Alcatrão --exclude = '/ pasta' --exclude ='. / Upload / folder2' -zcvf /backup/filename.tgz.)

O equivalente seria:

zip /backup/filename.zip -r. -x upload / pasta / ** \ * upload / folder2 / ** \ *

(Nota: Aqui está o post eu originalmente usado que me https://superuser.com/questions/312301/unix-zip-directory-but-excluded-specific-subdirectories-and-everything-within-t )

Confira

tar cvpzf zip_folder.tgz . --exclude=./public --exclude=./tmp --exclude=./log --exclude=fileName

O seguinte script bash deve fazer o truque. Ele usa a resposta dada aqui por Marcus Sundman.

#!/bin/bash

echo -n "Please enter the name of the tar file you wish to create with out extension "
read nam

echo -n "Please enter the path to the directories to tar "
read pathin

echo tar -czvf $nam.tar.gz
excludes=`find $pathin -iname "*.CC" -exec echo "--exclude \'{}\'" \;|xargs`
echo $pathin

echo tar -czvf $nam.tar.gz $excludes $pathin

Este irá imprimir o comando que você precisa e você pode simplesmente copiar e colá-lo novamente. Há provavelmente uma maneira mais elegante para fornecê-lo diretamente para a linha de comando.

Apenas mudança * .CC para qualquer outra extensão comum, nome do arquivo ou regex que você deseja excluir e este trabalho deve ainda.

Editar

Só para acrescentar um pouco de explicação; achado gera uma lista de arquivos que correspondem a regex escolhido (neste caso * .CC). Esta lista é passada através xargs para o comando echo. Isto imprime --exclude 'uma entrada a partir da lista'. As barras () são caracteres de escape para as "marcas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top