Shell-Befehl tar Verzeichnis mit Ausnahme bestimmter Dateien / Ordner
Frage
Gibt es einen einfachen Shell-Befehl / Skript, das von der Archivierung mit Ausnahme bestimmte Dateien / Ordner unterstützt?
Ich habe ein Verzeichnis, das mit einem Unterverzeichnis archiviert werden muß, die eine Reihe von sehr großen Dateien Ich brauche nicht zu sichern hat.
Nicht ganz Lösungen:
Der tar --exclude=PATTERN
Befehl entspricht das vorgegebene Muster und schließt diese Dateien, aber ich brauche bestimmte Dateien und Ordner ignorierten (vollständiger Dateipfad) werden, sonst gültige Dateien können ausgeschlossen werden.
Ich könnte auch den Befehl find verwenden, um eine Liste der Dateien zu erstellen und diejenigen ausschließen will ich nicht um die Liste zu Teer zu archivieren und weitergeben, aber das funktioniert nur mit einer kleinen Menge von Dateien. Ich habe Zehntausende.
Ich fange an, die einzige Lösung zu denken, ist eine Datei mit einer Liste von Dateien / Ordnern zu erstellen, um auszuschließen, dann rsync verwenden, um mit --exclude-from=file
all Dateien in ein tmp-Verzeichnis zu kopieren und dann tar-Archiv verwenden, die Verzeichnis.
Kann jemand denken Sie an eine bessere / effizientere Lösung?
EDIT: Charles Ma 's-Lösung funktioniert gut. Der große gotcha ist, dass die --exclude='./folder'
muss am Anfang des tar-Befehl sein. Voll Befehl (cd erste, so Sicherung ist relativ zu diesem Verzeichnis):
cd /folder_to_backup
tar --exclude='./folder' --exclude='./upload/folder2' -zcvf /backup/filename.tgz .
Lösung
Sie können mehrere ausschließen haben Optionen für Teer so
$ tar --exclude='./folder' --exclude='./upload/folder2' -zcvf /backup/filename.tgz .
etc arbeiten. Machen Sie sicher setzen --exclude
vor die Quell- und Ziel-Elemente.
Andere Tipps
Sie können ausschließen Verzeichnisse mit --exclude
für Teer.
Wenn Sie alles zu archivieren außer /usr
Sie verwenden können:
tar -zcvf /all.tgz / --exclude=/usr
In Ihrem Fall vielleicht so etwas wie
tar -zcvf archive.tgz arc_dir --exclude=dir/ignore_this_dir
Mögliche Optionen Ausschließen von Dateien / Verzeichnisse aus dem Backup mit tar:
Ausschließen von Dateien mit mehreren Mustern
tar -czf backup.tar.gz --exclude=PATTERN1 --exclude=PATTERN2 ... /path/to/backup
Dateien ausschließen eine Datei mit einer Liste von Mustern gefüllt ausschließen mit
tar -czf backup.tar.gz -X /path/to/exclude.txt /path/to/backup
Ausschließen von Dateien mit Hilfe von Tags durch eine Tag-Datei in einem beliebigen Verzeichnis platzieren, die übersprungen werden sollen
tar -czf backup.tar.gz --exclude-tag-all=exclude.tag /path/to/backup
alte Frage mit vielen Antworten, aber ich fand, dass keiner für mich ganz klar genug war, so mag ich meinen Versuch hinzuzufügen.
, wenn Sie die folgende Struktur
/home/ftp/mysite/
mit folgenden Datei / Ordner
/home/ftp/mysite/file1
/home/ftp/mysite/file2
/home/ftp/mysite/file3
/home/ftp/mysite/folder1
/home/ftp/mysite/folder2
/home/ftp/mysite/folder3
so wollen Sie eine tar-Datei machen, die every innen / home / ftp / mysite (zu bewegen, um die Website auf einen neuen Server) enthält, aber file3
ist nur Müll, und alles in folder3
ist auch nicht erforderlich, so dass wir überspringen werden diese beiden.
Wir verwenden das Format
tar -czvf <name of tar file> <what to tar> <any excludes>
, wo die c = schaffen, z = zip, und v = verbose (Sie die Dateien sehen können, wie sie eingegeben werden, sehr nützlich, dass keine der Dateien, damit Sie ausschließen hinzugefügt werden). und f = Datei.
so, mein Befehl würde wie folgt aussehen
cd /home/ftp/
tar -czvf mysite.tar.gz mysite --exclude='file3' --exclude='folder3'
Beachten Sie die Dateien / Ordner ausgeschlossen relativ zu der Wurzel Ihres Teers sind (ich habe vollständigen Pfad hier relativ versucht, / aber ich kann nicht, dass die Arbeit machen).
hoffen, dass dies jemand helfen (und mir, dass ich es beim nächsten Mal google)
Sie können mit Standard "ant Notation" Verzeichnisse relativ auszuschließen.
Dies funktioniert für mich und schließt jegliche .git oder node_module Verzeichnisse.
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
Ich habe erfahren, dass zumindest mit der Cygwin Version von tar Ich verwende ( "CYGWIN_NT-5.1 1.7.17 (0.262 / 03.05) 2012.10.19 14: 39 i686 Cygwin“auf einem Windows XP Home Edition SP3 Maschine), die Reihenfolge der Optionen ist wichtig.
Während diese Konstruktion funktioniert für mich:
tar cfvz target.tgz --exclude='<dir1>' --exclude='<dir2>' target_dir
, dass ein hat nicht Arbeit:
tar cfvz --exclude='<dir1>' --exclude='<dir2>' target.tgz target_dir
Dieses, während tar --help
ergibt folgendes:
tar [OPTION...] [FILE]
So sollte der zweite Befehl auch funktionieren, aber anscheinend scheint es nicht der Fall zu sein ...
Best rgds,
Dies schließt Muster behandelt Dateinamensuffix wie png oder mp3 sowie Verzeichnisnamen wie .git und node_modules
tar --exclude={*.png,*.mp3,*.wav,.git,node_modules} -Jcf ${target_tarball} ${source_dirname}
fand ich diese woanders so werde ich Kredit nicht nehmen, aber es funktionierte besser als jede der oben genannten Lösungen für meinen Mac spezifische Themen (auch wenn diese geschlossen ist):
tar zc --exclude __MACOSX --exclude .DS_Store -f <archive> <source(s)>
Für diejenigen, die Probleme mit ihm haben, würden einige Versionen von tar nur funktionieren, ohne die ‚./‘ im ausschließen Wert.
Tar --version
tar (GNU tar) 1.27.1
Befehlssyntax, die funktionieren:
tar -czvf ../allfiles-butsome.tar.gz * --exclude=acme/foo
Diese wird 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 *
Für Mac OSX ich tun musste,
tar -zcv --exclude='folder' -f theOutputTarFile.tar folderToTar
Beachten Sie die -f
nach dem --exclude=
Ich bin damit einverstanden die --exclude Flagge der richtige Ansatz ist.
$ tar --exclude='./folder_or_file' --exclude='file_pattern' --exclude='fileA'
Ein Wort Warnung für einen Nebeneffekt, dass ich nicht sofort offensichtlich gefunden: Der Ausschluss von 'dateiA' in diesem Beispiel wird für 'dateiA' Suche REKURSIVES!
Beispiel: Ein Verzeichnis mit einem einzigen Unterverzeichnis eine Datei mit dem gleichen Namen (data.txt)
enthältdata.txt
config.txt
--+dirA
| data.txt
| config.docx
-
Bei der Verwendung von
--exclude='data.txt'
das Archiv enthält nicht ENTWEDER Datei data.txt. Dies kann zu unerwarteten Ergebnissen führen, wenn Dritte Bibliotheken Archivierung, wie ein node_modules Verzeichnis. -
Um dieses Problem zu vermeiden, stellen Sie sicher, den gesamten Weg zu geben, wie
--exclude='./dirA/data.txt'
möglich 'xargs: Argument list too long'
Fehler zu vermeiden aufgrund der Verwendung von find ... | xargs ...
wenn Zehntausende von Dateien verarbeiten, können Sie die Ausgabe der find
direkt an tar
find ... -print0 | tar --null ...
verwendet wird.
# 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 -
diesen Thread Nach der Lektüre habe ich ein wenig Tests auf RHEL 5 und hier sind meine Ergebnisse für Teer des abc Verzeichnisses:
Dies wird die Verzeichnisse Fehler und Protokolle und alle Dateien unter den Verzeichnissen ausschließen:
tar cvpzf abc.tgz abc/ --exclude='abc/error' --exclude='abc/logs'
Das Hinzufügen eines Platzhalter nach dem ausgeschlossenen Verzeichnis die Dateien ausschließen, sondern bewahren Sie die Verzeichnisse:
tar cvpzf abc.tgz abc/ --exclude='abc/error/*' --exclude='abc/logs/*'
Verwenden Sie den Befehl in Verbindung mit der tar append (-r) Option. Auf diese Weise kann in einem einzigen Schritt, statt einer zwei Pass-Lösung (erstellen Liste von Dateien, Erstellen von tar-Dateien) zu einem bestehenden tar hinzuzufügen.
find /dir/dir -prune ... -o etc etc.... -exec tar rvf ~/tarfile.tar {} \;
Sie können auch eine der „--exclude-Tag“ Optionen verwenden, je nach Bedarf:
- - exclude-tag = FILE
- - exclude-tag-all = FILE
- - exclude-tag-under = FILE
Der Ordner der angegebenen Datei-Hosting, wird ausgeschlossen.
Sie können cpio (1) verwenden, um tar-Dateien zu erstellen. cpio nimmt die Dateien auf stdin zu archivieren, so dass, wenn Sie bereits den Befehl find herausgefunden haben, die Sie verwenden möchten die Dateien das Archiv, über eine Pipe in cpio wählen Sie die TAR-Datei zu erstellen:
find ... | cpio -o -H ustar | gzip -c > archive.tar.gz
Gnu tar v 1.26 die --exclude nach Archivdatei und Backup-Verzeichnis Argumente kommen muss, sollte keine führende oder nachgestellte Schrägstriche haben, und bevorzugt keine Anführungszeichen (einfach oder doppelt). So in Bezug auf das übergeordnete Verzeichnis gesichert werden, es ist:
tar cvfz /path_to/mytar.tgz ./dir_to_backup --exclude=some_path/to_exclude
all diese guten Antworten für verschiedene Versionen Nach dem Lesen und gelöst, die das Problem für mich, ich denke, gibt es sehr kleine Details, die sehr wichtig sind, und selten zu GNU / Linux allgemeinem Gebrauch , die aren ‚t genug betont und verdient mehr als Kommentare.
Also ich werde versuchen, die Frage nicht für jeden Fall zu beantworten, sondern stattdessen versuchen, zu registrieren, wo sie suchen , wenn die Dinge nicht funktionieren.
ES IST SEHR WICHTIG HINWEIS:
- DER ORDEN DES MATTER OPTIONEN: es ist das gleiche nicht die --exclude setzen vor als nach der Datei Option und Verzeichnisse zu sichern. Dies ist unerwartet, zumindest für mich, weil in meiner Erfahrung in GNU / Linux-Befehle, in der Regel die Reihenfolge der Optionen spielt keine Rolle.
- Verschiedene tar Versionen erwartet, dass diese Optionen in unterschiedlicher Reihenfolge: zum Beispiel @ Antwort Andrew , dass im letzten v 1.26 und 1.28 die schließt in GNU tar zeigt kommt, während in meinem Fall mit GNU tar 1.29, es ist die andere Art und Weise.
- THE folgende Schrägstriche MATTER : mind. In GNU tar 1.29, sollte nicht sein
In meinem Fall für GNU tar 1,29 auf Debian Strecke, den Befehl, der arbeitete, war
tar --exclude="/home/user/.config/chromium" --exclude="/home/user/.cache" -cf file.tar /dir1/ /home/ /dir3/
Die Zitate spielten keine Rolle, es funktioniert mit oder ohne sie.
Ich hoffe, das jemand von Nutzen sein wird.
Ihre beste Wette ist mit Teer finden zu verwenden, über xargs (die große Anzahl von Argumenten zu handhaben). Zum Beispiel:
find / -print0 | xargs -0 tar cjf tarfile.tar.bz2
tar -cvzf destination_folder source_folder -X /home/folder/excludes.txt
-X zeigt eine Datei, die eine Liste von Dateinamen enthält, die von der Sicherung ausgeschlossen werden muß. Zum Beispiel können Sie * ~ in dieser Datei angeben, keine Dateinamen enthalten mit ~ in der Sicherung zu beenden.
Mögliche redundante Antwort, aber da ich es nützlich gefunden, hier ist sie:
Während ein FreeBSD root (das heißt mit csh) Ich wollte mein ganzes Root-Dateisystem / mnt kopieren, aber ohne / usr und (natürlich) / mnt. Das ist, was funktioniert hat (ich bin /):
tar --exclude ./usr --exclude ./mnt --create --file - . (cd /mnt && tar xvd -)
Mein ganzer Punkt ist, dass es notwendig war (indem man die ./ ) auf angeben , um Teer, dass die ausgeschlossenen Verzeichnisse, in denen einen Teil des größeren Verzeichnisses kopiert werden.
Mein € 0,02
Ich hatte kein Glück Teer bekommt ein 5 Gigabyte Unterverzeichnis ein paar Ebene tief auszuschließen. Am Ende habe ich nur den Unix-Zip-Befehl. Es funktionierte sehr viel einfacher für mich.
So für dieses Beispiel aus dem ursprünglichen Post
(Tar --exclude = '/ Ordner' --exclude =‘. / Upload / folder2' -zcvf /backup/filename.tgz.)
Das Äquivalent wäre:
zip -r /backup/filename.zip. -x upload / Ordner / ** \ * Upload / folder2 / ** \ *
(Hinweis: Hier ist der Beitrag habe ich ursprünglich verwendet, die mir geholfen https://superuser.com/questions/312301/unix-zip-directory-but-excluded-specific-subdirectories-and-everything-within-t )
Überprüfen Sie es heraus
tar cvpzf zip_folder.tgz . --exclude=./public --exclude=./tmp --exclude=./log --exclude=fileName
Der folgende Bash-Skript sollte es tun. Es verwendet die Antwort gegeben hier von 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
Dies wird Sie müssen aus dem Befehl drucken und Sie können es nur in kopieren und einfügen zurück. Es ist wahrscheinlich eine elegantere Möglichkeit es direkt in die Befehlszeile zur Verfügung zu stellen.
Just ändern * .CC für andere gemeinsame Erweiterung, Dateinamen oder regex Sie ausschließen möchten, und dies sollte immer noch funktionieren.
EDIT
Nur eine kleine Erklärung hinzuzufügen; find generiert eine Liste von Dateien, die gewählte regex (in diesem Fall * .CC) entsprechen. Diese Liste wird über xargs den Echo-Befehl übergeben. Dies druckt --exclude ‚einen Eintrag aus der Liste‘. Die Schrägstriche () sind Escape-Zeichen für die "Mark.