Comando do shell para o diretório tar excluindo determinados arquivos / pastas


811

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=PATTERNcomando 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=filepara 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 .

120
Outra coisa que me chamou a atenção nisso, pode valer uma observação: barras invertidas no final de pastas excluídas farão com que o tar não exclua essas pastas.
Rekhyt

7
@Rekhyt obrigado, eu estava encarando o comando por 15 minutos ... então 30
earcam 6/6

9
Parece que a posição de --exclude depende da versão do tar. Para o tar 1.23, --exclude precisa vir após os comandos principais.
Joel G Mathew

2
Não esqueça o "'" (aspas).
Meetai.com 07/12/2013

3
--excludenão precisa ser o primeiro, mas deve estar em algum lugar antes do diretório de origem (testado com tar 1.29 no Cygwin).
Wortwart # /

Respostas:


1038

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. Faça certeza de colocar --exclude antes os itens de origem e de destino.


78
Esta resposta faz parecer que --exclude vem primeiro ... tar cvfpz ../stuff.tgz --exclude = 'node_modules' --exclude = '. Git'.
James O'Brien

13
Por exemplo, se você estiver tentando fazer backup da pasta do projeto wordpress, excluindo a pasta uploads, poderá usar este comando: tar -cvf wordpress_backup.tar wordpress --exclude = wp-content / uploads
shasi kanth

12
Eu vim com o seguinte comando: tar -zcv --exclude='file1' --exclude='patter*' --exclude='file2' -f /backup/filename.tgz . nota que as -fnecessidades bandeira para preceder o arquivo tar ver: superuser.com/a/559341/415047
Alfred Bez

21
Um "/" no final do diretório de exclusão fará com que ele falhe. Eu acho que o tar acha que um final / faz parte do nome do diretório a ser excluído. BAD: --exclude = mydir / BOM: --exclude = mydir
Josiah

4
> Certifique-se de colocar --exclude antes dos itens de origem e destino. OU use um caminho absoluto para a exclusão: tar -cvpzf backups / target.tar.gz --exclude = '/ home / nome de usuário / backups' / home / nome de usuário
NightKnight on Cloudinsidr.com

131

Você pode excluir diretórios com o --excludetar.

Se você deseja arquivar tudo, exceto /usrvocê 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

17
Para esclarecer, você pode usar o caminho completo para --exclude.
11119 Johan Soderberg

2
em alguns casos, é necessário que --exclude preceda os arquivos / pastas a serem arquivados
kronuus 25/01

68

Opções possíveis para excluir arquivos / diretórios do 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 de exclusão preenchido com uma lista de padrões

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

Excluir arquivos usando tags, colocando um arquivo de tags em qualquer diretório que deva ser ignorado

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

3
A ordem dos parâmetros parece importar e esse formulário funciona para mim.
Cstamas 1/10

1
Eu também. Para o tar (GNU tar) 1.28 no Ubuntu 16.04, apenas esta ordem específica de parâmetros funcionou.
Alvaroreig 08/08/19

43

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

/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ê 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 tudo folder3também não é necessário, então vamos pular esses dois.

nós usamos o formato

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

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

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

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)


6
Esta resposta definitivamente me ajudou! O problema para mim era que meu comando era algo parecido tar -czvf mysite.tar.gz mysite --exclude='./mysite/file3' --exclude='./mysite/folder3'e isso não excluía nada.
Anish Ramaswamy

2
Sua amostra foi muito parecida com a que eu tive problema! Obrigado!
Qorbani

2
Agradável e claro, obrigado. Para mim, a questão era que outras respostas incluem absoluto de caminhos relativos. Mas tudo que você precisa fazer é adicionar o nome da pasta que deseja excluir.
Hubert

2
Esta é uma resposta muito mais clara. Por causa do exemplo, consegui fazê-lo funcionar, pois os caminhos eram confusos no início. Muito obrigado!
Fagiani

2
funcionou! Lembre-se de não adicionar uma barra à exclusão. Por exemplo, enquanto "arquivo3" ou "arquivo3 / subpasta" funciona, "arquivo3 /" e "arquivo3 / subpasta /" não funcionam!
Lucaferrario #

24

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:

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


4
Acredito que isso exija que a variável de opção Bash shell globstartenha que estar ativada. Verifique com shopt -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. "
not2qubit

15

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:

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

aquele não funcionou:

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

Isso, embora tar --helprevele o seguinte:

tar [OPTION...] [FILE]

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

Best rgds,


5
Só quero acrescentar ao que foi dito acima, que é importante que o diretório a ser excluído NÃO contenha uma barra invertida final. Portanto, --exclude = '/ caminho / para / excluir / dir' está CORRETO , --exclude = '/ caminho / para / excluir / dir /' está ERRADO .
GeertVc

17
isso é porque o target.tgz arquivo alvo é um argumento da chave F, que deve seguir
Valentino

14

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

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

obrigado - era o que eu procurava :)
Alexander Br.

11

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

Tar --version

alcatrão (alcatrão GNU) 1.27.1

Sintaxe de comando que funciona:

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

Estes não funcionarão:

$ 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 *

10

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):

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

2
Obrigado por esta resposta, o alcatrão em darwin definitivamente tem uma sintaxe diferente e estava me deixando louco por que "--exclude = blah" nas outras respostas não estavam funcionando. Isso funcionou muito bem em um mac.
Michael

1
Não se esqueça COPYFILE_DISABLE=1ao usar tar, caso contrário, você pode obter ._ arquivos em seu arquivo tar
Benoit Duffez

Obrigado por incluir sua resposta. É sempre bom incluir um link para a fonte onde você encontrou a resposta. Bônus: se a fonte era de outro post de stackoverflow ou stackexchange, você recebe um karma extra (pontos ou emblemas - não me lembro qual). De qualquer forma, eles sorriem e todos ganham. Sem desvantagens :-) Isso também ajuda as pessoas que desejam pesquisar informações extras. Às vezes, as pessoas votam apenas porque você incluiu um link de origem. Por fim, compartilhar o problema específico que foi abordado ou por que essa era uma solução melhor, pode ajudar alguém com um problema único.
SherylHohman 18/05/19

8

Para o Mac OSX, tive que fazer

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

Observe o -fdepois do--exclude=


6

Concordo que a bandeira --exclude é a abordagem correta.

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

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)

data.txt
config.txt
--+dirA
  |  data.txt
  |  config.docx
  • 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'


5

Para evitar possíveis 'xargs: Argument list too long'erros devido ao uso de find ... | xargs ...ao processar dezenas de milhares de arquivos, você pode canalizar a saída finddiretamente para o taruso 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 -

você pode citar a string 'excluir', assim: 'somedir / filesdir / *', então o shell não expandirá asteriscos e outros caracteres brancos.
Znik

xargs -n 1é outra opção para evitar xargs: Argument list too longerros;)
Tuxdude 15/11

5

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:

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/*'

No segundo exemplo acima, deve haver asteriscos após a última barra em cada cláusula de exclusão, mas a postagem não os aceitou.
Mike

4

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).

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

4

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

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

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


4

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:

  1. A ORDEM DAS OPÇÕES IMPORTA: não é o mesmo que colocar a opção --exclude antes do que após a opção de arquivo e os diretórios para backup. Isso é inesperado, pelo menos para mim, porque na minha experiência, nos comandos GNU / Linux, geralmente a ordem das opções não importa.
  2. Versões diferentes do tar esperam essas opções em ordem diferente: por exemplo, a resposta de @ Andrew indica que no tar do GNU v 1.26 e 1.28 as exclusões vêm por último, enquanto no meu caso, com o tar 1.29 do GNU, é o contrário.
  3. O TRAILING SLASHES IMPORTA : pelo menos no GNU tar 1.29, não deveria ser nenhum .

No meu caso, para o GNU tar 1.29 no Debian, o comando que funcionou foi

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

As citações não importavam, funcionavam com ou sem elas.

Espero que isso seja útil para alguém.


Obrigado pela sua resposta. Eu estava procurando (o que pareceu um tempo muito longo) por uma solução, e sua resposta me guiou na direção certa. No entanto, no meu caso (Ubuntu 18.04.3, Tar 1.29), só consegui fazê-lo adicionando o nome da pasta e NÃO o caminho, por exemplo: tar --exclude = folder1 --exclude = folder2 -czvf / opt / archieve. Pasta tgz
Nitai 10/10

2

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:

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

2

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


Após muita experimentação, encontrei mais ou menos a mesma coisa com meu comando tar (GNU tar) 1.28.
usar o seguinte código

2
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 nomes de arquivos que terminem com ~ no backup.


Eu acho que essa é a melhor solução, já que funciona nesses casos, que o número de exclusões é grande. Também é possível incluir a opção X no pacote de opções, portanto a forma mais curta é provavelmente:tar cXvfJ EXCLUDE-LIST ARCHIVE.tar.xz SOURCE-FOLDER
Kai Petzke

0

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

4
Isso pode fazer com que o tar seja chamado várias vezes - e também compactará os arquivos repetidamente. Correto é:find / -print0 | tar -T- --null --no-recursive -cjf tarfile.tar.bz2
jørgensen 4/12/12

Eu li em algum lugar que, ao usar xargs, deve-se usar a ropção tar em vez de, cquando, findna 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 por xargse nem todos os resultados encontrados pelo findcomando.
Stphane

0

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 /):

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

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


0

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:

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

(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 )


3
Cuidado: zipnão empacota diretórios vazios, mas tarsim!
t0r0X 29/09

0

Confira

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

0

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:

tar --exclude='.git' -zcvf /tmp/angular.23.12.19.tar.gz /var/lib/tomcat7/webapps/angular/

0

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:

  1. 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.


0

Se você está tentando excluir arquivos do VCS (Version Control System), o tar já suporta duas opções interessantes! :)

  1. Opção: --exclude-vcs

Isto exclui opção arquivos e diretórios usados seguindo sistemas de controle de versão: CVS, RCS, SCCS, SVN, Arch, Bazaar, Mercurial, e Darcs.

A partir da versão 1.32, os seguintes arquivos são excluídos:

  • CVS/e tudo sob ele
  • RCS/e tudo sob ele
  • SCCS/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

    1. Opção: --exclude-vcs-ignores

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 .gitfileestá 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: globmuda para padrões de globbing shell. A linha syntax: regexpvolta. Os comentários começam com a #. Os padrões afetam o diretório e todos os seus subdiretórios.

  1. Exemplo

tar -czv --exclude-vcs --exclude-vcs-ignores -f path/to/my-tar-file.tar.gz path/to/my/project/


-1

O script bash a seguir 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

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 '.


1
Exigir entrada interativa é uma má opção de design para a maioria dos scripts de shell. Faça com que ele leia os parâmetros da linha de comando e obtenha o benefício da conclusão da guia do shell, conclusão do histórico, edição do histórico etc.
tripleee

1
Além disso, seu script não funciona para caminhos que contêm metacaracteres de espaço em branco ou shell. Basicamente, você sempre deve colocar variáveis ​​entre aspas duplas, a menos que exija especificamente que o shell execute a tokenização de espaço em branco e a expansão de curingas. Para obter detalhes, consulte stackoverflow.com/questions/10067266/…
tripleee
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.