comando Shell para o diretório tar a exclusão de certos arquivos / pastas
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 .
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:
- 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.
- 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.
- 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
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.