Domanda

C'è una semplice shell di comando/script che supporta l'esclusione di determinati file/cartelle archiviati?

Ho una directory che devono essere archiviati con una directory di sub che ha un certo numero di file di grandi dimensioni non ho bisogno di backup.

Non abbastanza soluzioni:

Il tar --exclude=PATTERN comando corrisponde a un modello dato, ad esclusione di quelle file, ma ho bisogno di specifici file e cartelle per essere ignorato (percorso completo del file), altrimenti i file validi potrebbero essere esclusi.

Potrei anche usare il comando trova per creare un elenco di file e di escludere quelli che non si desidera archiviare e trasmettere l'elenco tar, ma che funziona solo con una piccola quantità di file.Io sono decine di migliaia.

Sto cominciando a pensare che l'unica soluzione è 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 utilizzare il tar di archivio di directory.

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

EDIT: Carlo Ma's soluzione funziona bene.Il grande aspetto negativo è che il --exclude='./folder' DEVE all'inizio del comando tar.Completo di comando (cd prima, in modo che il backup è relativo alla directory):

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

Soluzione

È possibile avere più opzioni per tar esclude in modo

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

ecc funzionerà. Fai la che per mettere --exclude prima delle componenti l'origine e di destinazione.

Altri suggerimenti

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

Se si desidera archiviare tutto tranne /usr è possibile utilizzare:

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

Nel tuo caso, forse qualcosa di simile

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

Le possibili opzioni per escludere i file / cartelle dal backup usando tar:

escludere i file utilizzando più modelli

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

Escludi file utilizzando un file di esclusione riempito con una lista di modelli

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

Esclusione di file utilizzando i tag inserendo un file di tag in qualsiasi directory che dovrebbe essere saltato

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

vecchia domanda con molte risposte, ma ho scoperto che nessuno era abbastanza chiaro abbastanza per me, quindi vorrei aggiungere la mia specialità.

se si ha 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, si vuole fare in un file tar che contengono tutto ciò che è all'interno di /home/ftp/mysite (per spostare il sito su un nuovo server), ma file3 è solo spazzatura, e tutto il folder3 inoltre, non è necessario, in modo che possiamo ignorare quei due.

usiamo il formato

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

dove c = creare, z = zip, e v = verbose (si può vedere il file come sono entrato, utile per assicurarsi che nessuno dei file che è possibile escludere vengono aggiunti).e f= file.

quindi, il mio comando sarà simile a questa

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

nota i file/cartelle sono esclusi relativamente alla radice del tar (ho provato completo del percorso relativo al / ma non riesco a fare quel lavoro).

spero che questo vi aiuterà a qualcuno (e a me la prossima volta I google)

È possibile utilizzare standard "la notazione formica" per escludere le directory relativa.
Questo funziona per me ed esclude qualsiasi directory o .git 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

Ho sperimentato che, almeno con la Cygwin versione di tar 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 un non ha fatto di lavoro:

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

Questo, mentre tar --help rivela quanto segue:

tar [OPTION...] [FILE]

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

Le migliori rgds,

Questo esclude modello gestisce suffisso come png o mp3, così come i nomi delle 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 in modo da non prendersi 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 coloro che hanno problemi con esso, alcune versioni di tar funzionerebbero correttamente solo senza il './' nel valore escludere.

Tar --version
  

tar (catrame di GNU) 1.27.1

Sintassi del comando che lavorare:

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 Mac OSX che dovevo fare

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

Si noti la -f dopo la --exclude=

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

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

Una parola di avviso per un effetto collaterale che non ho trovato immediatamente evidente: L'esclusione di 'fileA' in questo esempio cercherà 'fileA' ricorsivamente!

Esempio: Una directory con un unico sottodirectory che contiene 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 l'archiviazione di librerie di terze parti, come ad esempio una directory node_modules.

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

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

Dopo aver letto questa discussione, ho fatto un po 'di test su RHEL 5 e qui sono i miei risultati per tarring backup della directory abc:

Questo esclude l'errore di directory e tronchi e tutti i file nelle directory:

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

L'aggiunta di un jolly dopo la directory esclusi escluderà i file, ma conservare le directory:

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

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 pass (creare l'elenco dei file, creare tar).

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

È inoltre possibile utilizzare una delle opzioni "--exclude-tag" a seconda delle esigenze:

  • - escludere-tag = FILE
  • - escludere-tag-all = FILE
  • - escludere-tag-under = FILE

sarà esclusa la cartella che ospita il file specificato.

È 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 si desidera utilizzare per selezionare i file dell'archivio, il tubo in cpio per creare il file tar:

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

tar GNU v 1.26 il --exclude deve venire dopo argomenti di file di archivio e directory di backup, non dovrebbe avere barre iniziali o finali, e preferisce senza virgolette (singole o doppie). Così relativo alla directory genitore di cui eseguire il backup, è:

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

Dopo aver letto tutto questo ben di risposte per le versioni diverse e avendo risolto il problema per me stesso, penso che ci sono molto piccoli dettagli che sono molto importanti, e raro uso generale GNU / Linux , che aren 't sottolineato abbastanza e merita più di commenti.

Quindi non ho intenzione di provare a rispondere alla domanda per ogni caso, ma, invece, provare a registrare dove cercare quando le cose non funzionano.

E 'molto importante notare:

  1. L'ordine delle opzioni MATERIA: non è lo stesso mettere il --exclude prima che dopo l'opzione di file e directory per il backup. Questo è inaspettato, almeno per me, perché nella mia esperienza, in comandi di GNU / Linux, di solito l'ordine delle opzioni non ha importanza.
  2. versioni di catrame Diverse prevede questa opzione in ordine diverso: per esempio, @ risposta di Andrew indica che in GNU tar v 1.26 e 1.28 esclude viene scorso, mentre nel mio caso, con GNU tar 1.29, è il contrario.
  3. IL TRAILING barre MATERIA :. Almeno in GNU tar 1.29, non dovrebbe essere alcun

Nel mio caso, per GNU tar 1.29 su Debian tratto, 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 importa, ha funzionato con o senza di loro.

Spero che questo possa essere utile a qualcuno.

La cosa migliore è quella di utilizzare trovare con tar, via xargs (per gestire il gran numero di argomenti). Ad esempio:

find / -print0 | xargs -0 tar cjf tarfile.tar.bz2
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 esempio, è possibile specificare * ~ in questo file per non includere alcuna nomi di file che terminano con ~ nel backup.

possibile risposta ridondante, ma da quando ho trovato utile, eccolo qui:

Mentre una radice FreeBSD (vale a dire usando csh) ho voluto copiare tutto il mio filesystem di root in / mnt ma senza / usr e (ovviamente) / mnt. Questo è ciò che ha funzionato (io sono a /):

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

Il mio punto è che era necessario (mettendo la ./ ) per specificare a tar che le directory escluse in cui parte della directory maggiore di essere copiati.

Il mio € 0,02

Non ho avuto fortuna ottenere tar per escludere una sottodirectory 5 Gigabyte alcuni livelli di profondità. Alla fine, ho solo usato il comando unix Zip. Ha funzionato molto più facile per me.

Quindi, per questo esempio particolare dal post originale
(Tar --exclude = '/ cartella' --exclude ='. / Upload / cartella2' -zcvf /backup/filename.tgz.)

L'equivalente sarebbe:

  

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

(NOTA: Ecco il post che ho utilizzato in origine che mi https://superuser.com/questions/312301/unix-zip-directory-but-excluded-specific-subdirectories-and-everything-within-t )

Check it out

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

Il seguente script bash dovrebbe fare il trucco. Esso utilizza 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 stampa il comando è necessario e si può solo copiare e incollare di nuovo. C'è probabilmente un modo più elegante per fornire direttamente alla riga di comando.

Basta cambiare * .CC per qualsiasi altro interno comune, nome del file o regex che si desidera escludere e questo dovrebbe ancora funzionare.

Modifica

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top