linux - procurar - Comando shell para o diretório tar excluindo certos arquivos/pastas




find atime linux (16)

Confira

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

Existe um comando / script simples que suporte a exclusão de determinados arquivos / pastas de serem arquivados?

Eu tenho um diretório que precisa ser arquivado com um subdiretório que tem um número de arquivos muito grandes que eu não preciso fazer backup.

Não é bem soluções:

O comando tar --exclude=PATTERN corresponde ao padrão fornecido e exclui esses arquivos, mas eu preciso que arquivos e pastas específicos sejam ignorados (caminho completo do arquivo), caso contrário, arquivos válidos podem ser excluídos.

Eu 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 o 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, em seguida, usar rsync com --exclude-from=file para copiar todos os arquivos para um diretório tmp e, em seguida, usar tar para arquivar esse diretório.

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

EDIT: solução da cma funciona bem. O grande problema é que o --exclude='./folder' DEVE estar no início do comando tar. Comando completo (primeiro cd, então o backup é relativo a esse diretório):

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

Depois de ler este tópico, fiz um pequeno teste no RHEL 5 e aqui estão os meus resultados para tarring o diretório abc:

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

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

Adicionar um curinga após o diretório excluído excluirá os arquivos, mas preservará os diretórios:

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

Eu concordo que o sinalizador --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 achei imediatamente óbvio: A exclusão de 'fileA' neste exemplo irá procurar por 'fileA' RECURSIVELY!

Exemplo: Um diretório com um único subdiretório contendo um arquivo com o mesmo nome (data.txt)

data.txt
config.txt
--+dirA
  |  data.txt
  |  config.docx
  • Se estiver usando --exclude='data.txt' o arquivo não conterá nem o arquivo data.txt. 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'


Eu encontrei isso em outro lugar, então eu não vou tomar crédito, mas funcionou melhor do que qualquer uma das soluções acima para meus problemas específicos do Mac (mesmo que isso seja fechado):

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

Não tive sorte em conseguir tar para excluir um subdiretório de 5 Gigabytes a alguns níveis de profundidade. No final, usei apenas o comando unix Zip. Isso funcionou muito mais fácil para mim.

Então, para este exemplo específico da postagem original
(tar --exclude = '. / pasta' --exclude = '. / upload / folder2' -zcvf /backup/nome_do_arquivo.tgz.)

O equivalente seria:

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

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


O seguinte script bash deve fazer o truque. Ele usa a resposta dada here 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

Isso imprimirá o comando necessário e você poderá simplesmente copiá-lo e colá-lo de volta. Provavelmente, existe uma maneira mais elegante de fornecê-lo diretamente à linha de comando.

Apenas altere * .CC para qualquer outra extensão comum, nome de arquivo ou regex que você queira excluir e isso ainda deve funcionar.

EDITAR

Apenas para adicionar uma pequena explicação; find gera uma lista de arquivos correspondentes à regex escolhida (nesse caso, * .CC). Esta lista é passada via xargs para o comando echo. Isto imprime --exclui 'uma entrada da lista'. As barras () são caracteres de escape para as 'marcas.


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

Tar --version

tar (tar GNU) 1.27.1

Sintaxe de comando que funciona:

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

Isso não 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 evitar possíveis erros de 'xargs: Argument list too long' devido ao uso de find ... | xargs ... find ... | xargs ... ao processar dezenas de milhares de arquivos, você pode canalizar a saída de find diretamente para tar usando find ... -print0 | tar --null ... 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 -

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. Isso é o que funcionou (estou em /):

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

Meu ponto de vista é que era necessário (colocando o ./ ) especificar ao tar que os diretórios excluídos eram parte do maior diretório sendo copiado.

Meus 0,02 €


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

find / -print0 | xargs -0 tar cjf tarfile.tar.bz2

Você pode excluir diretórios com --exclude para tar.

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

Você pode ter várias opções de exclusão para o tar

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

etc vai funcionar. Certifique- se de colocar --exclude antes dos itens de origem e destino.


Você pode usar o padrão "ant notation" para excluir diretórios relativos.
Isso funciona para mim e exclui quaisquer diretórios .git ou node_module.

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


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

  • --exclude-tag = FILE
  • --exclude-tag-all = ARQUIVO
  • --exclude-tag-under = FILE

A pasta que hospeda o FILE especificado será excluída.


velha pergunta com muitas respostas, mas eu achei que nenhuma foi bastante clara o suficiente para mim, então eu gostaria de adicionar 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 contendo everyting dentro de / home / ftp / mysite (para mover o site para um novo servidor), mas file3 é apenas lixo, e tudo em folder3 também não é necessário, então vamos pular aqueles dois.

nós usamos o formato

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

em que c = create, z = zip e v = verbose (é possível ver os arquivos conforme eles são inseridos, útil para garantir que nenhum dos arquivos excluídos esteja sendo adicionado). e f = arquivo.

então, meu comando ficaria assim

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

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

Espero que isso ajude alguém (e eu da próxima vez eu google isso)


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. Para Instância, você pode especificar * ~ neste arquivo para não incluir nomes de arquivos que terminem em ~ no backup.







tar