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 .
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.
È 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
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
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)
È 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
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,
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}
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)>
Per Mac OSX ho dovuto fare
tar -zcv --exclude='folder' -f theOutputTarFile.tar folderToTar
Nota -f
dopo --exclude=
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 *
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 -
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'
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 {} \;
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/*'
Puoi anche utilizzare una delle opzioni "--exclude-tag" a seconda delle tue esigenze:
La cartella che ospita il FILE specificato sarà esclusa.
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
È 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
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.
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
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:
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.
Controlla
tar cvpzf Zip_folder.tgz . --exclude=./public --exclude=./tmp --exclude=./log --exclude=fileName
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 )
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