Frage Shell-Befehl zum Tar-Verzeichnis ohne bestimmte Dateien / Ordner


Gibt es einen einfachen Shell-Befehl / Skript, das das Ausschließen bestimmter Dateien / Ordner vor der Archivierung unterstützt?

Ich habe ein Verzeichnis, das mit einem Unterverzeichnis archiviert werden muss, das eine Anzahl sehr großer Dateien hat, die ich nicht sichern muss.

Nicht ganz Lösungen:

Das tar --exclude=PATTERN Der Befehl stimmt mit dem angegebenen Muster überein und schließt diese Dateien aus, aber ich brauche bestimmte Dateien und Ordner, die ignoriert werden sollen (vollständiger Dateipfad), andernfalls werden möglicherweise gültige Dateien ausgeschlossen.

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

Ich fange an zu denken, dass die einzige Lösung darin besteht, eine Datei mit einer Liste von Dateien / Ordnern zu erstellen, die ausgeschlossen werden sollen, und dann rsync mit verwenden --exclude-from=file Kopieren Sie alle Dateien in ein tmp-Verzeichnis und verwenden Sie dann tar, um dieses Verzeichnis zu archivieren.

Kann jemand an eine bessere / effizientere Lösung denken?

BEARBEITEN: cmaDie Lösung funktioniert gut. Das große Problem ist, dass die --exclude='./folder'  MUSS Sei am Anfang des tar-Befehls. Voller Befehl (CD zuerst, also Sicherung ist relativ zu diesem Verzeichnis):

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

586
2018-06-11 22:57


Ursprung


Antworten:


Sie können mehrere Ausschlussoptionen für tar haben

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

usw. wird funktionieren. Machen sicher stellen --exclude  Vor die Quell- und Zielelemente.


727
2018-06-11 23:11



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

Wenn Sie alles außer archivieren wollen /usr Sie können verwenden:

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

In deinem Fall vielleicht so etwas wie

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

116
2018-06-11 23:08



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

Dateien mit mehreren Mustern ausschließen

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

Schließen Sie Dateien mit einer Ausschlussdatei aus, die mit einer Musterliste gefüllt ist

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

Schließen Sie Dateien mithilfe von Tags aus, indem Sie eine Tag-Datei in ein beliebiges Verzeichnis einfügen, das übersprungen werden soll

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

47
2017-11-08 00:22



alte Frage mit vielen Antworten, aber ich fand, dass keine für mich klar genug war, also würde ich gerne 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

Also, Sie möchten eine TAR-Datei erstellen, die everyting innerhalb von / home / ftp / mysite enthält (um die Site auf einen neuen Server zu verschieben), aber file3 ist nur Müll und alles drin folder3 wird auch nicht benötigt, also werden wir diese beiden überspringen.

Wir benutzen das Format

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

wo die c = erstellen, z = zip und v = verbose (Sie können die Dateien sehen, wie sie eingegeben werden, nützlich, um sicherzustellen, dass keine der Dateien, die Sie ausschließen, hinzugefügt werden). und f = Datei.

Also, mein Befehl würde so aussehen

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

Beachten Sie, dass die ausgeschlossenen Dateien / Ordner relativ zur Wurzel Ihres Tears sind (Ich habe den vollständigen Pfad hier relativ zu / ausprobiert, aber ich kann das nicht machen).

hoffe, das wird jemandem helfen (und mir das nächste Mal, wenn ich es google)


31
2018-05-08 10:48



Das habe ich zumindest bei der Cygwin Version von tar ich benutze ("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-Rechner), die Reihenfolge der Optionen ist wichtig.

Während dieser Aufbau für mich funktionierte:

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

Das hier nicht Arbeit:

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

Dies, während tar --help enthüllt folgendes:

tar [OPTION...] [FILE]

Also, der zweite Befehl sollte auch funktionieren, aber anscheinend scheint es nicht der Fall zu sein ...

Beste rgds,


14
2017-12-31 07:08



Sie können Standard "ant notation" verwenden, um Verzeichnisse relativ auszuschließen.
Dies funktioniert für mich 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


11
2018-05-14 14:10



Ich habe das woanders gefunden, also werde ich keinen Kredit nehmen, aber es funktionierte besser als jede der obigen Lösungen für meine Mac-spezifischen Probleme (obwohl dies geschlossen ist):

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

10
2018-02-05 21:59



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}

8
2018-02-12 20:55



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 tar hinzufügen, anstatt eine Lösung mit zwei Durchgängen (Liste der Dateien erstellen, tar erstellen).

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

4
2018-06-11 23:03



Um dies zu vermeiden 'xargs: Argument list too long' Fehler aufgrund der Verwendung von find ... | xargs ... Wenn Sie Zehntausende von Dateien verarbeiten, können Sie die Ausgabe von find direkt zu tar verwenden 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 -

4
2018-03-04 15:18



Ich stimme der --exclude Flagge ist der richtige Ansatz.

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

Ein Wort von Warnung für einen Nebeneffekt, den ich nicht sofort gefunden habe: Der Ausschluss von 'DateiA' in diesem Beispiel wird nach 'DateiA' suchen REKURSIV!

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
  • Wenn Sie verwenden --exclude='data.txt' Das Archiv wird nicht enthalten ENTWEDER data.txt-Datei. Dies kann zu unerwarteten Ergebnissen führen, wenn Sie Bibliotheken von Drittanbietern wie z. B. das Verzeichnis node_modules archivieren.

  • Um dieses Problem zu vermeiden, stellen Sie sicher, dass Sie den gesamten Pfad angeben --exclude='./dirA/data.txt' 


4
2017-07-15 15:56