Comando Shell nella directory tar escludendo determinati file / cartelle


812

Esiste un semplice comando / script di shell che supporta l'esclusione di determinati file / cartelle dall'archiviazione?

Ho una directory che deve essere archiviata con una sottodirectory che contiene numerosi file molto grandi di cui non ho bisogno per il backup.

Non proprio soluzioni:

Il tar --exclude=PATTERNcomando corrisponde al modello specificato ed esclude quei file, ma ho bisogno di file e cartelle specifici da ignorare (percorso completo del file), altrimenti i file validi potrebbero essere esclusi.

Potrei anche usare il comando find per creare un elenco di file ed escludere quelli che non voglio archiviare e passare l'elenco a tar, ma funziona solo con una piccola quantità di file. Ne ho decine di migliaia.

Sto iniziando a pensare che l'unica soluzione sia quella di creare un file con un elenco di file / cartelle da escludere, quindi utilizzare rsync con --exclude-from=fileper copiare tutti i file in una directory tmp e quindi usare tar per archiviare quella directory.

Qualcuno può pensare a una soluzione migliore / più efficiente?

EDIT: la soluzione di Charles Ma funziona bene. Il grande gotcha è che --exclude='./folder' DEVE essere all'inizio del comando tar. Comando completo (prima cd, quindi il backup è relativo a quella directory):

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

121
Un'altra cosa che mi ha sorpreso su questo, potrebbe valere la pena di notare: le barre finali alla fine delle cartelle escluse faranno sì che tar non escluda affatto quelle cartelle.
Rekhyt,

7
@Rekhyt grazie, stavo fissando il comando per 15 minuti ... poi 30
earcam

9
Sembra che la posizione di --exclude dipenda dalla versione di tar. Per tar 1.23, --exclude deve seguire i comandi principali.
Joel G Mathew,

2
Non dimenticare il "'" (virgolette).
Meetai.com,

3
--excludenon deve essere il primo, ma deve venire prima della directory dei sorgenti (testato con tar 1.29 su Cygwin).
Wortwart,

Risposte:


1038

Puoi avere più opzioni di esclusione per tar così

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

ecc funzionerà. Fare sicuri di mettere --exclude prima le voci di origine e di destinazione.


78
Questa risposta fa sembrare che --exclude venga prima ... tar cvfpz ../stuff.tgz --exclude = 'node_modules' --exclude = '. Git'.
James O'Brien,

13
Ad esempio, se si sta tentando di eseguire il backup della cartella del progetto wordpress, esclusa la cartella dei caricamenti, è possibile utilizzare questo comando: tar -cvf wordpress_backup.tar wordpress --exclude = wp-content / uploads
shasi kanth

12
Ho trovato il seguente comando: tar -zcv --exclude='file1' --exclude='patter*' --exclude='file2' -f /backup/filename.tgz . nota che la -fbandiera deve precedere il file tar, vedi: superuser.com/a/559341/415047
Alfred Bez,

21
Un "/" alla fine della directory exclude non riuscirà. Immagino che tar pensi che un finale / faccia parte del nome della directory da escludere. CATTIVO: --exclude = mydir / BUONO: --exclude = mydir
Josiah

4
> Assicurati di inserire --exclude prima degli elementi di origine e destinazione. O usa un percorso assoluto per l'esclusione: tar -cvpzf backups / target.tar.gz --exclude = '/ home / username /
backups

131

È possibile escludere directory con --excludefor tar.

Se vuoi archiviare tutto tranne /usrche puoi usare:

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

Nel tuo caso forse qualcosa del genere

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

17
Per chiarire, puoi usare il percorso completo per --exclude.
Johan Soderberg,

2
in alcuni casi, è necessario che --exclude preceda i file / cartelle da archiviare
kronuus

68

Opzioni possibili per escludere file / directory dal backup usando tar:

Escludere i file utilizzando più pattern

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

Escludere i file utilizzando un file di esclusione riempito con un elenco di motivi

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

Escludere i file utilizzando i tag posizionando un file tag in qualsiasi directory che deve essere ignorata

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

3
L'ordinamento dei parametri sembra avere importanza e questo modulo funziona per me.
cstamas,

1
Anch'io. Per tar (GNU tar) 1.28 su Ubuntu 16.04, ha funzionato solo questo specifico ordine di parametri.
alvaroreig,

43

vecchia domanda con molte risposte, ma ho scoperto che nessuna era abbastanza chiara per me, quindi vorrei aggiungere il mio tentativo.

se hai la seguente struttura

/home/ftp/mysite/

con i seguenti file / cartelle

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

quindi, vuoi creare un file tar che contenga tutto all'interno di / home / ftp / mysite (per spostare il sito su un nuovo server), ma file3è solo spazzatura e tutto infolder3 non è necessario, quindi salteremo quei due.

usiamo il formato

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

dove c = create, z = zip e v = verbose (puoi vedere i file man mano che vengono inseriti, utile per assicurarti che nessuno dei file che escludi vengano aggiunti). e f = file.

quindi, il mio comando sarebbe simile a questo

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

nota che i file / cartelle esclusi sono relativamente alla radice del tuo tar (ho provato il percorso completo qui rispetto a / ma non riesco a farlo funzionare).

spero che questo possa aiutare qualcuno (e la prossima volta che lo google)


6
Questa risposta mi ha sicuramente aiutato! Il problema per me era che il mio comando sembrava qualcosa del genere tar -czvf mysite.tar.gz mysite --exclude='./mysite/file3' --exclude='./mysite/folder3', e questo non escludeva nulla.
Anish Ramaswamy,

2
Il tuo campione è stato molto simile a quello che avevo riscontrato! Grazie!
Qorbani,

2
Bello e chiaro grazie. Per me il problema era che le altre risposte includono l'assoluto dei percorsi relativi. Ma tutto ciò che devi fare è aggiungere il nome della cartella che desideri escludere.
Hubert,

2
Questa è una risposta molto più chiara. Grazie all'esempio sono stato in grado di farlo funzionare poiché i percorsi inizialmente erano confusi. Grazie mille!
fagiani,

2
ha funzionato! Ricorda di non aggiungere una barra finale all'esclusione. Ad esempio, mentre "file3" o "file3 / sottocartella" funziona, "file3 /" e "file3 / sottocartella /" non funzionano!
lucaferrario,

24

È possibile utilizzare la "notazione di formica" standard per escludere le directory relative.
Questo funziona per me ed esclude qualsiasi directory .git o node_module:

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

myInputFile.txt contiene:

/ dev2 / java
/ dev2 / javascript


4
Credo che ciò richieda che la variabile di opzione shell Bash globstardebba essere abilitata. Verificare con shopt -s globstar. Credo che sia fuori per default sulla maggior parte del sistema operativo basato su Unix. Dal manuale di Bash: " globstar: se impostato, il modello **utilizzato in un contesto di espansione del nome corrisponderà a tutti i file e zero o più directory e sottodirectory. Se il modello è seguito da un '/', corrispondono solo le directory e le sottodirectory. "
not2qubit

15

L'ho provato, almeno con la versione Cygwin di tar che sto usando ("CYGWIN_NT-5.1 1.7.17 (0.262 / 5/3) 2012-10-19 14:39 i686 Cygwin" su Windows XP Home Edition SP3), l'ordine delle opzioni è importante.

Mentre questa costruzione ha funzionato per me:

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

quello non ha funzionato:

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

Questo, mentre tar --helprivela quanto segue:

tar [OPTION...] [FILE]

Quindi, anche il secondo comando dovrebbe funzionare, ma a quanto pare non sembra essere il caso ...

Best rgds,


5
Voglio solo aggiungere a quanto sopra, che è importante che la directory da escludere NON contenga una barra rovesciata finale. Quindi, --exclude = '/ path / to / exclude / dir' è CORRETTO , --exclude = '/ path / to / exclude / dir /' è SBAGLIATO .
GeertVc,

17
questo perché l'archivio target target.tgz è un argomento dell'opzione f, che dovrebbe seguire
Valentino

14

Questo modello di esclusione gestisce il suffisso del nome file come png o mp3, nonché i nomi delle directory come .git e node_modules

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

grazie - è quello che stavo cercando :)
Alexander Br.

11

Per coloro che hanno problemi con esso, alcune versioni di tar funzionerebbero correttamente solo senza './' nel valore di esclusione.

Tar --version

tar (GNU tar) 1.27.1

Sintassi dei comandi che funziona:

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

Questi non funzioneranno:

$ 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

L'ho trovato da qualche altra parte, quindi non mi prenderò il merito, ma ha funzionato meglio di qualsiasi delle soluzioni sopra per i miei problemi specifici del Mac (anche se questo è chiuso):

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

2
Grazie per questa risposta, il tar su darwin ha sicuramente una sintassi diversa e mi stava facendo impazzire perché "--exclude = blah" nelle altre risposte non funzionava. Questo ha funzionato alla grande su un mac.
Michael,

1
Non dimenticare di COPYFILE_DISABLE=1usare tar, altrimenti potresti avere ._ file nel tuo tarball
Benoit Duffez,

Grazie per aver incluso la tua risposta. È sempre bello includere un link alla fonte in cui hai trovato la risposta. Bonus: se la fonte proveniva da un altro post stackoverflow o stackexchange, otterrai un karma extra (punti o badge - non ricordo quale). Ad ogni modo, ottengono un sorriso e tutti vincono. Nessun aspetto negativo :-) Aiuta anche le persone che vogliono cercare informazioni extra. A volte le persone voteranno solo perché hai incluso un link sorgente. Infine, condividendo il problema specifico affrontato o perché questa fosse una soluzione migliore, potrebbe aiutare qualcun altro con un problema unico.
SherylHohman,

8

Per Mac OSX ho dovuto fare

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

Nota il -fdopo il--exclude=


6

Sono d'accordo che la bandiera --exclude sia l'approccio giusto.

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

Un avvertimento per un effetto collaterale che non ho trovato immediatamente ovvio: l'esclusione di "fileA" in questo esempio cercherà "fileA" RICURSIVAMENTE!

Esempio: una directory con una singola sottodirectory contenente un file con lo stesso nome (data.txt)

data.txt
config.txt
--+dirA
  |  data.txt
  |  config.docx
  • Se si utilizza --exclude='data.txt'l'archivio non conterrà SIA data.txt file. Ciò può causare risultati imprevisti se si archiviano librerie di terze parti, come una directory node_modules.

  • Per evitare questo problema assicurati di dare l'intero percorso, come --exclude='./dirA/data.txt'


5

Per evitare possibili 'xargs: Argument list too long'errori dovuti all'uso find ... | xargs ...durante l'elaborazione di decine di migliaia di file, è possibile reindirizzare l'output finddirettamente tarall'utilizzo 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 -

puoi citare la stringa 'exclude', in questo modo: 'somedir / filesdir / *' quindi la shell non espanderà gli asterischi e altri caratteri bianchi.
Znik

xargs -n 1è un'altra opzione per evitare xargs: Argument list too longerrori;)
Tuxdude,

5

Dopo aver letto questo thread, ho fatto un piccolo test su RHEL 5 e qui sono i miei risultati per il tarring della directory abc:

Ciò escluderà l'errore delle directory, i registri e tutti i file nelle directory:

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

L'aggiunta di un carattere jolly dopo la directory esclusa esclude i file ma conserva le directory:

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

Nel secondo esempio sopra ci dovrebbero essere asterischi dopo l'ultima barra in ogni clausola di esclusione, ma il post non li ha presi.
Mike,

4

Utilizzare il comando find in combinazione con l'opzione tar append (-r). In questo modo è possibile aggiungere file a un tar esistente in un solo passaggio, invece di una soluzione a due passaggi (creare un elenco di file, creare tar).

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

4

Puoi anche utilizzare una delle opzioni "--exclude-tag" in base alle tue esigenze:

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

La cartella che ospita il FILE specificato verrà esclusa.


4

Dopo aver letto tutte queste buone risposte per versioni diverse e aver risolto il problema da solo, penso che ci siano dettagli molto piccoli che sono molto importanti e rari per l'uso generale di GNU / Linux , che non sono abbastanza stressati e meritano più di commenti.

Quindi non proverò a rispondere alla domanda per ogni caso, ma cercherò invece di registrare dove cercare quando le cose non funzionano.

È MOLTO IMPORTANTE AVVISARE:

  1. L'ORDINE DELLE OPZIONI CONTINUA: non è lo stesso mettere il --exclude prima che dopo il backup dell'opzione file e delle directory. Questo è inaspettato, almeno per me, perché nella mia esperienza, nei comandi GNU / Linux, di solito l'ordine delle opzioni non ha importanza.
  2. Diverse versioni tar si aspettano queste opzioni in ordine diverso: ad esempio, la risposta di Andrew indica che in GNU tar v 1.26 e 1.28 le esclusioni arrivano per ultime, mentre nel mio caso, con GNU tar 1.29, è l'altro modo.
  3. THE TRAILING SLASHES MATTER : almeno in GNU tar 1.29, non dovrebbe esserlo .

Nel mio caso, per GNU tar 1.29 su Debian stretch, il comando che ha funzionato è stato

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

Le citazioni non avevano importanza, funzionava con o senza di esse.

Spero che questo sia utile a qualcuno.


La ringrazio per la risposta. Stavo cercando (che sembrava molto tempo) una soluzione, e la tua risposta mi ha guidato nella giusta direzione. Tuttavia, nel mio caso (Ubuntu 18.04.3, Tar 1.29) ho potuto solo farlo funzionare aggiungendo il nome della cartella e NON il percorso, ad esempio: tar --exclude = folder1 --exclude = folder2 -czvf / opt / archieve. cartella tgz
Nitai

2

Puoi usare cpio (1) per creare file tar. cpio prende i file da archiviare su stdin, quindi se hai già capito il comando find che vuoi usare per selezionare i file dell'archivio, esegui il pipe in cpio per creare il file tar:

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

2

gnu tar v 1.26 --exclude deve venire dopo il file di archivio e gli argomenti della directory di backup, non dovrebbe avere barre iniziali o finali e non preferisce virgolette (singole o doppie). Quindi rispetto alla directory PARENT di cui eseguire il backup, è:

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


Dopo molte sperimentazioni ho trovato più o meno la stessa cosa con il mio comando tar (GNU tar) 1.28.
PicoutputCls

2
tar -cvzf destination_folder source_folder -X /home/folder/excludes.txt

-X indica un file che contiene un elenco di nomi di file che devono essere esclusi dal backup. Ad esempio, è possibile specificare * ~ in questo file per non includere alcun nome di file che termina con ~ nel backup.


Penso che questa sia la soluzione migliore, dato che funziona anche in quei casi, che il numero di esclusioni è elevato. È anche possibile includere l'opzione X nel pacchetto di opzioni, quindi la forma più breve è probabilmente:tar cXvfJ EXCLUDE-LIST ARCHIVE.tar.xz SOURCE-FOLDER
Kai Petzke

0

La tua scommessa migliore è usare find with tar, via xargs (per gestire il gran numero di argomenti). Per esempio:

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

4
Ciò può far sì che tar venga invocato più volte e comprime ripetutamente i file. Corretto è:find / -print0 | tar -T- --null --no-recursive -cjf tarfile.tar.bz2
jørgensen

Ho letto da qualche parte che quando si usa xargs, si dovrebbe usare l' ropzione tar invece che cperché quando in findrealtà trova un sacco di risultati, gli xargs suddividono quei risultati (basati sul limite degli argomenti della riga di comando locale) in blocchi e invocano tar su ogni parte. Ciò comporterà un archivio contenente l'ultimo blocco restituito da xargse non tutti i risultati trovati dal findcomando.
Stphane,

0

Possibile risposta ridondante ma da quando l'ho trovata utile, eccola qui:

Mentre un root di FreeBSD (cioè usando csh) volevo copiare il mio intero filesystem di root su / mnt ma senza / usr e (ovviamente) / mnt. Questo è ciò che ha funzionato (I am at /):

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

Il mio punto è che era necessario (inserendo il ./ ) specificare di tar che le directory escluse dovevano essere copiate parte della directory maggiore.

I miei € 0,02


0

Non ho avuto fortuna a ottenere tar per escludere una sottodirectory da 5 Gigabyte a pochi livelli di profondità. Alla fine, ho appena usato il comando zip unix. Ha funzionato molto più facilmente per me.

Quindi, per questo esempio particolare dal post originale
(tar --exclude = '. / Folder' --exclude = '. / Upload / folder2' -zcvf /backup/filename.tgz.)

L'equivalente sarebbe:

zip -r /backup/filename.zip. -x upload / cartella / ** \ * upload / cartella2 / ** \ *

(NOTA: ecco il post che ho usato originariamente che mi ha aiutato /superuser/312301/unix-zip-directory-but-excluded-specific-subdirectories-and-everything-within-t )


3
Attenzione: zipnon comprime directory vuote, ma lo tarfa!
t0r0X,

0

Controlla

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

0

Voglio avere una nuova versione front-end (cartella angolare) su localhost. Inoltre, la cartella git è enorme nel mio caso e voglio escluderla. Devo scaricarlo dal server e decomprimerlo per eseguire l'applicazione.

Comprimi la cartella angolare da / var / lib / tomcat7 / webapps, spostala nella cartella / tmp con il 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 di successo: 1) se si fornisce il percorso completo per eseguire il backup, in exclude deve essere utilizzato anche il percorso completo.

tar -zcvf /opt/ABC/BKP_27032020/backup_27032020.tar.gz --exclude = '/ opt / ABC / csv / ' --exclude = '/ opt / ABC / log / ' / opt / ABC

2) se si fornisce il percorso corrente per eseguire il backup, anche in exclude deve essere utilizzato solo il percorso corrente.

tar -zcvf backup_27032020.tar.gz --exclude = 'ABC / csv / ' --exclude = 'ABC / log / ' ABC

Caso di fallimento:

  1. se si dà alla directory currentpath il backup e il percorso completo da ignorare, non funzionerà

    tar -zcvf /opt/ABC/BKP_27032020/backup_27032020.tar.gz --exclude = '/ opt / ABC / csv / ' --exclude = '/ opt / ABC / log / ' ABC

Nota: la menzione di exclude prima / dopo la directory di backup va bene.


0

Se stai cercando di escludere i file VCS (Version Control System), tar supporta già due opzioni interessanti al riguardo! :)

  1. Opzione: --exclude-vcs

Ciò esclude opzione i file e le directory utilizzate seguendo sistemi di controllo versione: CVS, RCS, SCCS, SVN, Arch, Bazaar, Mercurial, e Darcs.

A partire dalla versione 1.32, sono esclusi i seguenti file:

  • CVS/e tutto sotto di esso
  • RCS/e tutto sotto di esso
  • SCCS/e tutto sotto di esso
  • .git/e tutto sotto di esso
  • .gitignore
  • .gitmodules
  • .gitattributes
  • .cvsignore
  • .svn/e tutto sotto di esso
  • .arch-ids/e tutto sotto di esso
  • {arch}/e tutto sotto di esso
  • =RELEASE-ID
  • =meta-update
  • =update
  • .bzr
  • .bzrignore
  • .bzrtags
  • .hg
  • .hgignore
  • .hgrags
  • _darcs

    1. Opzione: --exclude-vcs-ignores

Quando si archiviano directory che si trovano in alcuni sistemi di controllo versione (VCS), è spesso conveniente leggere i pattern di esclusione dai file ignorati di questo VCS (ad es .cvsignore. .gitignore, Ecc.). Questa opzione offre tale possibilità.

Prima di archiviazione di una directory, vedere se contiene uno dei seguenti file: cvsignore, .gitignore, .bzrignore, o .hgignore. In tal caso, leggi ignora i pattern di questi file.

Gli schemi sono trattati in modo simile a come li tratterebbe il VCS corrispondente, ovvero:

.cvsignore

Contiene modelli globbing in stile shell che si applicano solo alla directory in cui risiede questo file. Non sono consentiti commenti nel file. Le righe vuote vengono ignorate.

.gitignore

Contiene modelli di globbing stile shell. Si applica alla directory in cui .gitfilesi trova e a tutte le sue sottodirectory.

Qualsiasi riga che inizia con a #è un commento. La barra rovesciata sfugge al carattere del commento.

.bzrignore

Contiene modelli di globbing shell ed espressioni regolari (se preceduto da RE:(16). I pattern influenzano la directory e tutte le sue sottodirectory.

Qualsiasi riga che inizia con a #è un commento.

.hgignore

Contiene espressioni regolari posix (17). La linea syntax: globpassa a modelli di globbing shell. La linea syntax: regexpritorna indietro. I commenti iniziano con a #. I pattern influenzano la directory e tutte le sue sottodirectory.

  1. Esempio

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


-1

Il seguente script bash dovrebbe fare il trucco. Usa la risposta data qui da 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

Questo stamperà il comando che ti serve e puoi semplicemente copiarlo e incollarlo nuovamente. Probabilmente esiste un modo più elegante per fornirlo direttamente alla riga di comando.

Basta cambiare * .CC per qualsiasi altra estensione, nome di file o regex comune che si desidera escludere e questo dovrebbe comunque funzionare.

MODIFICARE

Solo per aggiungere una piccola spiegazione; find genera un elenco di file corrispondenti al regex scelto (in questo caso * .CC). Questo elenco viene passato tramite xargs al comando echo. Questo stampa - esclude 'una voce dalla lista'. Le barre () sono caratteri di escape per i segni '.


1
Richiedere input interattivi è una scelta di progettazione scadente per la maggior parte degli script di shell. Fallo invece leggere i parametri della riga di comando e otterrai il vantaggio del completamento della scheda della shell, del completamento della cronologia, della modifica della cronologia, ecc.
Tripleee

1
Inoltre, lo script non funziona per i percorsi che contengono spazi bianchi o metacaratteri di shell. Fondamentalmente dovresti sempre mettere le variabili tra virgolette doppie a meno che tu non abbia specificamente richiesto alla shell di eseguire la tokenizzazione degli spazi bianchi e l'espansione dei caratteri jolly. Per ulteriori informazioni, si prega di consultare stackoverflow.com/questions/10067266/...
tripleee
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.