risposta-alla-domanda-sullo-sviluppo-web-bd.com

Comando Shell alla directory tar escludendo determinati file/cartelle

C'è 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 ha un numero di file molto grandi che non ho bisogno di fare il backup.

Non proprio soluzioni:

Il comando tar --exclude=PATTERN 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 che funziona solo con una piccola quantità di file. Ne ho decine di migliaia.

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

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

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

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

Puoi avere più opzioni di esclusione per tar così

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

ecc funzionerà. Crea sure per mettere --exclude before gli elementi di origine e destinazione.

881
Charles Ma

È possibile escludere le directory con --exclude per tar.

Se vuoi archiviare tutto tranne /usr puoi usare:

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

Nel tuo caso forse qualcosa di simile

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

Possibili opzioni per escludere file/directory dal backup usando tar:

Escludere i file utilizzando più modelli

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 usando i tag posizionando un file di tag in qualsiasi directory che dovrebbe essere saltata

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

vecchia domanda con molte risposte, ma ho trovato che nessuno era abbastanza chiaro per me, quindi vorrei aggiungere il mio tentativo.

se hai la seguente struttura

/home/ftp/mysite/

con il seguente 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 dentro/home/ftp/mysite (per spostare il sito su un nuovo server), ma file3 è solo junk, e anche tutto in folder3 non è necessario, quindi salteremo quelli Due.

usiamo il formato

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

dove c = create, z = Zip e v = verbose (è possibile visualizzare i file non appena vengono inseriti, utile per assicurarsi che nessuno dei file che si esclude venga aggiunto). 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 relativo a/ma non riesco a farlo funzionare).

spero che questo aiuti qualcuno (e io la prossima volta che lo google)

38
Sverre

È possibile utilizzare la "notazione ant" standard per escludere le directory relative.
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

17
Eric Manley

L'ho sperimentato, almeno con Cygwin versione di tar che sto usando ("CYGWIN_NT-5.1 1.7.17 (0.262/5/3) 2012-10-19 14:39 i686 Cygwin" su una macchina 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

che uno non ha lavoro:

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

Questo, mentre tar --help rivela quanto segue:

tar [OPTION...] [FILE]

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

I migliori rgds,

16
GeertVc

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

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

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

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

Per Mac OSX ho dovuto fare

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

Nota -f dopo --exclude=

7
Jerinaw

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

Tar --version

tar (GNU tar) 1.27.1

Sintassi del comando 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 *
7
J. Lawson

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

Sono d'accordo che il flag --exclude sia l'approccio giusto.

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

Una parola di warning per un effetto collaterale che non ho trovato immediatamente ovvio: l'esclusione di "fileA" in questo esempio cercherà "fileA" RECURSIVELY!

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àIL FILEdata.txt. Ciò può causare risultati imprevisti se si archiviano librerie di terze parti, ad esempio una directory node_modules.

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

5
Aaron Votre

Utilizzare il comando find in combinazione con l'opzione tar append (-r). In questo modo è possibile aggiungere file a un tar esistente in un unico 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
Alex B

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

Questo escluderà l'errore e i registri delle directory e tutti i file sotto le 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 preserva le directory:

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

Puoi anche utilizzare una delle opzioni "--exclude-tag" a seconda delle tue esigenze:

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

La cartella che ospita il FILE specificato sarà esclusa.

3
frommelmak

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

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

2
Andrew

È possibile utilizzare 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, inseriscilo in cpio per creare il file tar:

find ... | cpio -o -H ustar | gzip -c > archive.tar.gz
2
camh
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. Per l'istanza, è possibile specificare * ~ in questo file per non includere nomi di file che terminano con ~ nel backup.

1
Ashwini Gupta

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

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

Dopo aver letto tutte queste buone risposte per diverse versioni e aver risolto il problema per me stesso, penso che ci sono dettagli molto piccoli che sono molto importanti, e rari all'utilizzo generale di GNU/Linux, che non sono abbastanza stressati e merita più dei commenti.

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

IT IS MOLTO IMPORTANTE DA NOTARE:

  1. L'ORDINE DELLE OPZIONI È IMPORTANTE: non è lo stesso mettere il --exclude prima di dopo l'opzione del file e le directory di backup. 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 di tar si aspettano questa opzione in un ordine diverso: per esempio, @ Risposta di Andrew indica che in GNU tar v 1.26 e 1.28 gli escludieni arrivano per ultimi, mentre nel mio caso , con GNU tar 1.29, è l'altro modo.
  3. IL TRAGUARDO SCENDE MATERIA: almeno in GNU tar 1.29, non dovrebbe essere nessuno.

Nel mio caso, per GNU tar 1.29 su Debian stretch, il comando che funzionava era

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

Le virgolette non importavano, funzionava con o senza di esse.

Spero che questo possa essere utile a qualcuno.

1
user2553863

Controlla

tar cvpzf Zip_folder.tgz . --exclude=./public --exclude=./tmp --exclude=./log --exclude=fileName
0
RohitPorwal

Non ho avuto fortuna a ottenere tar per escludere una sottodirectory da 5 Gigabyte di qualche livello. Alla fine, ho appena usato il comando unix Zip. Ha funzionato molto più facile per me.

Quindi per questo particolare esempio del post originale
(tar --exclude = './folder' --exclude = './upload/folder2' -zcvf /backup/filename.tgz.)

L'equivalente sarebbe:

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

(NOTA: Ecco il post che ho originariamente usato che mi ha aiutato https://superuser.com/questions/312301/unix-Zip-directory-but-excluded-specific-subdirectories-and-everything-within-t )

0
user2792605

Possibile risposta ridondante ma poiché l'ho trovata utile, eccola:

Mentre una radice di FreeBSD (cioè usando csh) volevo copiare il mio intero filesystem di root in/mnt ma senza/usr e (ovviamente)/mnt. Questo è ciò che ha funzionato (sono a /):

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

Il mio punto è che è stato necessario (inserendo ./ ) in specificare a tar che le directory escluse dovevano copiare parte della directory più grande.

Il mio € 0,02

0
George