it-swarm.com.de

Shell-Befehl an tar-Verzeichnis mit Ausnahme bestimmter Dateien / Ordner

Gibt es einen einfachen Shell-Befehl/ein einfaches Shell-Skript, mit dem bestimmte Dateien/Ordner von der Archivierung ausgeschlossen werden können?

Ich habe ein Verzeichnis, das mit einem Unterverzeichnis archiviert werden muss, das eine Reihe sehr großer Dateien enthält, die ich nicht sichern muss.

Nicht ganz Lösungen:

Der Befehl tar --exclude=PATTERN stimmt mit dem angegebenen Muster überein und schließt diese Dateien aus. Ich benötige jedoch bestimmte Dateien und Ordner, die ignoriert werden müssen (vollständiger Dateipfad). Andernfalls werden möglicherweise gültige Dateien ausgeschlossen.

Ich könnte auch den Befehl find verwenden, um eine Liste von Dateien zu erstellen und diejenigen auszuschließen, die ich nicht archivieren und die Liste an tar übergeben möchte, aber das funktioniert nur mit einer kleinen Menge von Dateien. Ich habe Zehntausende.

Ich beginne zu denken, die einzige Lösung ist, eine Datei mit einer Liste der auszuschließenden Dateien/Ordner zu erstellen, dann rsync mit --exclude-from=file zu verwenden, um alle Dateien in ein tmp-Verzeichnis zu kopieren und dann mit tar zu archivieren dieses Verzeichnis.

Kann sich jemand eine bessere/effizientere Lösung vorstellen?

EDIT: Charles Ma die Lösung funktioniert gut. Das große Problem ist, dass der --exclude='./folder'MUSS am Anfang des tar-Befehls steht. Vollständiger Befehl (CD zuerst, Sicherung ist also relativ zu diesem Verzeichnis):

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

Sie können also mehrere Ausschlussoptionen für tar haben

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

etc wird funktionieren. Stellen Sie sicher, um --excludevor die Quell- und Zielelemente zu setzen.

939
Charles Ma

Sie können Verzeichnisse mit --exclude für tar ausschließen.

Wenn Sie alles außer /usr archivieren möchten, können Sie Folgendes verwenden:

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

In deinem Fall vielleicht sowas

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

Mögliche Optionen zum Ausschließen von Dateien/Verzeichnissen von der Sicherung mit tar:

Schließen Sie Dateien mit mehreren Mustern aus

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

Schließen Sie Dateien mit einer Ausschlussdatei aus, die mit einer Liste von Mustern gefüllt ist

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

Schließen Sie Dateien mit Tags aus, indem Sie eine Tag-Datei in einem beliebigen Verzeichnis ablegen, das übersprungen werden soll

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

alte Frage mit vielen Antworten, aber ich fand, dass keine für mich ganz klar genug war, also möchte ich meinen Versuch hinzufügen.

wenn Sie die folgende Struktur haben

/home/ftp/mysite/

mit folgenden Dateien/Ordnern

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

sie möchten also eine tar-Datei erstellen, die alles in/home/ftp/mysite enthält (um die Site auf einen neuen Server zu verschieben), aber file3 ist nur Junk, und alles in folder3 ist auch nicht benötigt, so werden wir diese beiden überspringen.

wir verwenden das Format

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

dabei sind c = create, z = zip und v = verbose (Sie können die eingegebenen Dateien anzeigen, um sicherzustellen, dass keine der ausgeschlossenen Dateien hinzugefügt werden). und f = file.

so würde mein Befehl aussehen

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

beachten Sie, dass sich die ausgeschlossenen Dateien/Ordner relativ zum Stammverzeichnis Ihres Tar befinden.

hoffe das hilft jemandem (und mir beim nächsten googeln)

42
Sverre

Sie können die Standardnotation "ant" verwenden, um relative Verzeichnisse auszuschließen.
Dies funktioniert bei mir und schließt alle .git- oder node_module-Verzeichnisse aus.

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

myInputFile.txt enthält:

/ dev2/Java
/dev2/Javascript

17
Eric Manley

Ich habe erfahren, dass ich zumindest mit der Cygwin Version von tar ("CYGWIN_NT-5.1 1.7.17 (0.262/5/3 ) 2012-10-19 14:39 i686 Cygwin "auf einem Windows XP Home Edition SP3-Computer) ist die Reihenfolge der Optionen wichtig.

Während dieser Aufbau für mich arbeitete:

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

dieser hat nicht funktioniert

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

Dies, während tar --help Folgendes offenbart:

tar [OPTION...] [FILE]

Der zweite Befehl sollte also auch funktionieren, aber anscheinend scheint das nicht der Fall zu sein ...

Beste rgds,

16
GeertVc

Dieses Ausschlussmuster behandelt Dateinamensuffixe wie png oder mp3 sowie Verzeichnisnamen wie .git und node_modules

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

Für diejenigen, die Probleme damit haben, würden einige Versionen von tar nur ohne das './' im Ausschlusswert richtig funktionieren.

Tar --version

teer (GNU-Teer) 1.27.1

Befehlssyntax, die funktioniert:

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

Diese werden nicht funktionieren:

$ 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
J. Lawson

Ich habe dies an einer anderen Stelle gefunden, damit ich keine Gutschrift erhalten kann, aber es hat besser funktioniert als alle oben genannten Lösungen für meine Mac-spezifischen Probleme (obwohl dies geschlossen ist):

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

Für Mac OSX musste ich das tun

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

Beachten Sie den -f nach dem --exclude=

7
Jerinaw

Ich bin damit einverstanden, dass das Flag --exclude der richtige Ansatz ist.

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

Ein Wort von Warnung für einen Nebeneffekt, den ich nicht sofort erkannt habe: Der Ausschluss von 'fileA' in diesem Beispiel sucht nach 'fileA' RECURSIVELY!

Beispiel: Ein Verzeichnis mit einem einzelnen Unterverzeichnis, das eine Datei mit demselben Namen enthält (data.txt)

data.txt
config.txt
--+dirA
  |  data.txt
  |  config.docx
  • Bei Verwendung von --exclude='data.txt' enthält das Archiv keine ENTWEDER data.txt-Datei. Dies kann zu unerwarteten Ergebnissen führen, wenn Bibliotheken von Drittanbietern archiviert werden, z. B. ein node_modules-Verzeichnis.

  • Um dieses Problem zu vermeiden, geben Sie unbedingt den gesamten Pfad an, z. B. --exclude='./dirA/data.txt'.

6
Aaron Votre

Um mögliche 'xargs: Argument list too long'-Fehler aufgrund der Verwendung von find ... | xargs ... bei der Verarbeitung von Zehntausenden von Dateien zu vermeiden, können Sie die Ausgabe von find mit find ... -print0 | tar --null ... direkt an tar weiterleiten.

# 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

Nachdem ich diesen Thread gelesen habe, habe ich RHEL 5 ein wenig getestet und hier sind meine Ergebnisse zum Teern des abc-Verzeichnisses:

Dies schließt den Verzeichnisfehler und die Protokolle sowie alle Dateien unter den Verzeichnissen aus:

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

Durch das Hinzufügen eines Platzhalters nach dem ausgeschlossenen Verzeichnis werden die Dateien ausgeschlossen, die Verzeichnisse bleiben jedoch erhalten:

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

Verwenden Sie den Befehl find in Verbindung mit der Option tar append (-r). Auf diese Weise können Sie Dateien in einem einzigen Schritt zu einem vorhandenen Teer hinzufügen, anstatt einer Lösung mit zwei Durchläufen (Dateiliste erstellen, Teer erstellen).

find /dir/dir -Prune ... -o etc etc.... -exec tar rvf ~/tarfile.tar {} \;
4
Alex B

Sie können auch eine der Optionen "--exclude-tag" verwenden, je nach Ihren Anforderungen:

  • --exclude-tag = DATEI
  • --exclude-tag-all = DATEI
  • --exclude-tag-under = DATEI

Der Ordner, in dem sich die angegebene DATEI befindet, wird ausgeschlossen.

3
frommelmak

gnu tar v 1.26 Der Befehl --exclude muss nach den Argumenten für die Archivdatei und das Sicherungsverzeichnis stehen, darf keine führenden oder nachfolgenden Schrägstriche enthalten und bevorzugt keine Anführungszeichen (einfach oder doppelt). In Bezug auf das zu sichernde PARENT-Verzeichnis ist dies also:

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

2
Andrew

Mit cpio (1) können Sie Tar-Dateien erstellen. cpio archiviert die Dateien unter stdin. Wenn Sie also bereits den Befehl find gefunden haben, mit dem Sie die Dateien im Archiv auswählen möchten, leiten Sie ihn an cpio weiter, um die tar-Datei zu erstellen:

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

Nachdem ich all diese guten Antworten für verschiedene Versionen gelesen und das Problem für mich gelöst habe, denke ich , dass es sehr kleine Details gibt, die sehr wichtig sind und für die allgemeine Verwendung von GNU/Linux selten sind . Das ist nicht genug betont und verdient mehr als Kommentare.

Ich werde also nicht versuchen, die Frage für jeden Fall zu beantworten, sondern stattdessen zu registrieren , wo nachzuschauen ist , wenn die Dinge nicht funktionieren.

IT IS SEHR WICHTIG ZU BEACHTEN:

  1. Die Reihenfolge der Optionen ist wichtig: Es ist nicht dasselbe, wenn --exclude vor und nach der Dateioption und den zu sichernden Verzeichnissen steht. Dies ist zumindest für mich unerwartet, da es meiner Erfahrung nach bei GNU/Linux-Befehlen normalerweise nicht auf die Reihenfolge der Optionen ankommt.
  2. Verschiedene tar-Versionen erwarten diese Optionen in unterschiedlicher Reihenfolge: zum Beispiel @ Andrews Antwort gibt an, dass in GNU tar v 1.26 und 1.28 Der Ausschluss kommt zum Schluss, während es in meinem Fall mit GNU tar 1.29 umgekehrt ist.
  3. THE TRAILING SLASHES MATER : Zumindest in GNU tar 1.29 sollte es kein sein.

In meinem Fall war für GNU tar 1.29 unter Debian stretch der Befehl, der funktionierte

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

Die Zitate spielten keine Rolle, es funktionierte mit oder ohne sie.

Ich hoffe, das wird jemandem nützlich sein.

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

-X gibt eine Datei an, die eine Liste von Dateinamen enthält, die von der Sicherung ausgeschlossen werden müssen. Zum Beispiel können Sie * ~ in dieser Datei angeben, um keine Dateinamen in die Sicherung aufzunehmen, die mit ~ enden.

1
Ashwini Gupta

Am besten verwenden Sie find mit tar über xargs (um die große Anzahl von Argumenten zu verarbeiten). Zum Beispiel:

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

Hör zu

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

Ich hatte kein Glück, dass tar ein 5-Gigabyte-Unterverzeichnis ein paar Ebenen tief ausschloss. Am Ende habe ich nur den Unix-Zip-Befehl verwendet. Für mich hat es viel einfacher geklappt.

Also für dieses spezielle Beispiel aus dem Originalbeitrag
(tar --exclude = './folder' --exclude = './upload/folder2' -zcvf /backup/filename.tgz.)

Das Äquivalent wäre:

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

(HINWEIS: Hier ist der Beitrag, den ich ursprünglich verwendet habe und der mir geholfen hat https://superuser.com/questions/312301/unix-Zip-directory-but-excluded-specific-subdirectories-and- alles in t )

0
user2792605

Möglicherweise überflüssige Antwort, aber da ich es nützlich fand, hier ist es:

Als FreeBSD-Root (d. H. Mit csh) wollte ich mein gesamtes Root-Dateisystem nach/mnt kopieren, aber ohne/usr und (offensichtlich)/mnt. Das hat funktioniert (ich bin bei /):

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

Mein ganzer Punkt ist, dass es notwendig war (durch Setzen des ./), um anzugeben , dass die ausgeschlossenen Verzeichnisse Teil waren des größeren Verzeichnisses, das kopiert wird.

Meine € 0,02

0
George