Gibt es einen einfachen Shell-Befehl / ein einfaches Shell-Skript, das das Ausschließen bestimmter Dateien / Ordner von der Archivierung unterstützt?
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 tar --exclude=PATTERN
Befehl entspricht dem angegebenen Muster und schließt diese Dateien aus. Ich muss jedoch bestimmte Dateien und Ordner ignorieren (vollständiger Dateipfad), da sonst gültige Dateien möglicherweise ausgeschlossen werden.
Ich könnte auch den Befehl find verwenden, um eine Liste von Dateien zu erstellen und diejenigen auszuschließen, die ich nicht archivieren und an tar übergeben möchte, 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 auszuschließenden Dateien / Ordnern zu erstellen, dann mit rsync mit --exclude-from=file
alle Dateien in ein tmp-Verzeichnis zu kopieren und dieses Verzeichnis dann mit tar zu archivieren.
Kann sich jemand eine bessere / effizientere Lösung vorstellen?
EDIT: Charles Ma 's Lösung funktioniert gut. Das große Problem ist, dass das --exclude='./folder'
MUSS am Anfang des Tar-Befehls stehen muss. 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 .
--exclude
muss nicht der erste sein, sondern muss irgendwo vor dem Quellverzeichnis stehen (getestet mit tar 1.29 auf Cygwin).Antworten:
Sie können also mehrere Ausschlussoptionen für Teer haben
etc wird funktionieren. Stellen Sie sicher zu stellen ,
--exclude
bevor der Quell- und Zielartikel.quelle
tar -zcv --exclude='file1' --exclude='patter*' --exclude='file2' -f /backup/filename.tgz .
ausgedacht : Beachten Sie, dass das-f
Flag vor der TAR-Datei stehen muss, siehe: superuser.com/a/559341/415047Sie können Verzeichnisse mit
--exclude
for tar ausschließen.Wenn Sie alles archivieren möchten, außer
/usr
Sie können verwenden:In deinem Fall vielleicht so etwas
quelle
Mögliche Optionen zum Ausschließen von Dateien / Verzeichnissen von der Sicherung mit tar:
Schließen Sie Dateien mit mehreren Mustern aus
Schließen Sie Dateien mit einer Ausschlussdatei aus, die mit einer Liste von Mustern gefüllt ist
Schließen Sie Dateien mithilfe von Tags aus, indem Sie eine Tag-Datei in einem beliebigen Verzeichnis ablegen, das übersprungen werden soll
quelle
alte Frage mit vielen Antworten, aber ich fand, dass keine für mich klar genug war, deshalb möchte ich meinen Versuch hinzufügen.
wenn Sie die folgende Struktur haben
mit folgenden Dateien / Ordnern
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
nur Junk ist, und alles infolder3
wird auch nicht benötigt, also werden wir diese beiden überspringen.Wir verwenden das Format
Dabei ist c = create, z = zip und v = verbose (Sie können die eingegebenen Dateien sehen, um sicherzustellen, dass keine der von Ihnen ausgeschlossenen Dateien hinzugefügt wird). und f = Datei.
Mein Befehl würde also so aussehen
Beachten Sie, dass die ausgeschlossenen Dateien / Ordner relativ zum Stammverzeichnis Ihres Teers liegen (ich habe hier den vollständigen Pfad relativ zu / versucht, aber ich kann das nicht zum Laufen bringen).
hoffe, das wird jemandem helfen (und mir, wenn ich es das nächste Mal google)
quelle
tar -czvf mysite.tar.gz mysite --exclude='./mysite/file3' --exclude='./mysite/folder3'
, und dies schloss nichts aus.Sie können die Standard-Ameisennotation verwenden, um relative Verzeichnisse auszuschließen.
Dies funktioniert für mich und schließt alle .git- oder node_module-Verzeichnisse aus:
myInputFile.txt enthält:
/ dev2 / java
/ dev2 / javascript
quelle
globstar
aktiviert sein muss. Überprüfen Sie mitshopt -s globstar
. Ich denke, es ist standardmäßig auf den meisten Unix-basierten Betriebssystemen deaktiviert. Aus dem Bash-Handbuch: " globstar: Wenn festgelegt,**
stimmt das in einem Dateinamenerweiterungskontext verwendete Muster mit allen Dateien und null oder mehr Verzeichnissen und Unterverzeichnissen überein. Wenn dem Muster ein '/' folgt,Ich habe das erlebt, zumindest mit der Cygwin- Version von tar, die ich verwende ("CYGWIN_NT-5.1 1.7.17 (0.262 / 5/3) 2012-10-19 14:39 i686 Cygwin" auf einer Windows XP Home Edition SP3-Maschine) ist die Reihenfolge der Optionen wichtig.
Während diese Konstruktion für mich funktionierte:
das hat nicht funktioniert:
Dies
tar --help
zeigt zwar Folgendes:Der zweite Befehl sollte also auch funktionieren, aber anscheinend scheint dies nicht der Fall zu sein ...
Beste rgds,
quelle
Dieses Ausschlussmuster behandelt Dateinamensuffixe wie png oder mp3 sowie Verzeichnisnamen wie .git und node_modules
quelle
Für diejenigen, die Probleme damit haben, würden einige Versionen von tar nur ohne das './' im Ausschlusswert ordnungsgemäß funktionieren.
Befehlssyntax, die funktioniert:
Diese werden nicht funktionieren:
quelle
Ich habe dies woanders gefunden, damit ich keine Gutschrift bekomme, aber es hat besser funktioniert als jede der oben genannten Lösungen für meine Mac-spezifischen Probleme (obwohl dies geschlossen ist):
quelle
COPYFILE_DISABLE=1
wenn Sie tar verwenden, sonst erhalten Sie möglicherweise ._-Dateien in Ihrem TarballFür Mac OSX musste ich tun
tar -zcv --exclude='folder' -f theOutputTarFile.tar folderToTar
Beachten Sie die
-f
nach dem--exclude=
quelle
Ich bin damit einverstanden, dass das Flag --exclude der richtige Ansatz ist.
Ein warnendes Wort für eine Nebenwirkung, die ich nicht sofort offensichtlich fand: Der Ausschluss von 'fileA' in diesem Beispiel sucht REKURSIV nach 'fileA' !
Beispiel: Ein Verzeichnis mit einem einzelnen Unterverzeichnis, das eine gleichnamige Datei enthält (data.txt)
Bei Verwendung
--exclude='data.txt'
des Archivs nicht enthalten ENTWEDER data.txt Datei. Dies kann zu unerwarteten Ergebnissen führen, wenn Bibliotheken von Drittanbietern archiviert werden, z. B. ein Verzeichnis node_modules.Um dieses Problem zu vermeiden, geben Sie den gesamten Pfad an, z
--exclude='./dirA/data.txt'
quelle
Um mögliche
'xargs: Argument list too long'
Fehler aufgrund der Verwendung vonfind ... | xargs ...
bei der Verarbeitung von Zehntausenden von Dateien zu vermeiden , können Sie die Ausgabe vonfind
direkt antar
using weiterleitenfind ... -print0 | tar --null ...
.quelle
xargs -n 1
ist eine weitere Option, umxargs: Argument list too long
Fehler zu vermeiden ;)Nachdem ich diesen Thread gelesen hatte, habe ich ein wenig mit RHEL 5 getestet und hier sind meine Ergebnisse für das Teern des abc-Verzeichnisses:
Dadurch werden der Verzeichnisfehler und die Protokolle sowie alle Dateien unter den Verzeichnissen ausgeschlossen:
Durch Hinzufügen eines Platzhalters nach dem ausgeschlossenen Verzeichnis werden die Dateien ausgeschlossen, die Verzeichnisse jedoch beibehalten:
quelle
Verwenden Sie den Befehl find in Verbindung mit der Option tar append (-r). Auf diese Weise können Sie einem vorhandenen Teer in einem einzigen Schritt Dateien hinzufügen, anstatt einer Lösung mit zwei Durchgängen (Liste der Dateien erstellen, Teer erstellen).
quelle
Sie können je nach Ihren Anforderungen auch eine der Optionen "--exclude-tag" verwenden:
Der Ordner, in dem sich die angegebene DATEI befindet, wird ausgeschlossen.
quelle
Nachdem ich all diese guten Antworten für verschiedene Versionen gelesen und das Problem für mich selbst gelöst habe, denke ich, dass es sehr kleine Details gibt, die sehr wichtig und für den allgemeinen Gebrauch von GNU / Linux selten sind, die nicht genug betont werden und mehr als Kommentare verdienen.
Ich werde also nicht versuchen, die Frage für jeden Fall zu beantworten, sondern zu registrieren, wo gesucht werden muss, wenn die Dinge nicht funktionieren.
Es ist sehr wichtig zu beachten:
In meinem Fall war für GNU tar 1.29 auf Debian Stretch der Befehl, der funktionierte
Die Zitate spielten keine Rolle, es funktionierte mit oder ohne sie.
Ich hoffe, dass dies jemandem nützlich sein wird.
quelle
Mit cpio (1) können Sie TAR-Dateien erstellen. cpio archiviert die Dateien auf stdin. Wenn Sie also bereits den Befehl find gefunden haben, mit dem Sie die zu archivierenden Dateien auswählen möchten, leiten Sie ihn an cpio weiter, um die TAR-Datei zu erstellen:
quelle
gnu tar v 1.26 --exclude muss nach Argumenten für Archivdatei und Sicherungsverzeichnis stehen, sollte 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 es also:
tar cvfz /path_to/mytar.tgz ./dir_to_backup --exclude=some_path/to_exclude
quelle
tar (GNU tar) 1.28
.-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, die mit ~ enden, in die Sicherung aufzunehmen.
quelle
tar cXvfJ EXCLUDE-LIST ARCHIVE.tar.xz SOURCE-FOLDER
Am besten verwenden Sie find mit tar über xargs (um die große Anzahl von Argumenten zu verarbeiten). Zum Beispiel:
quelle
find / -print0 | tar -T- --null --no-recursive -cjf tarfile.tar.bz2
xargs
dier
Option tar verwenden sollte, anstatt , dass die xargs diese Ergebnisse (basierend auf dem Limit der lokalen Befehlszeilenargumente) in Chuncks aufteilen und tar für jeden Teil aufrufen,c
wennfind
tatsächlich viele Ergebnisse gefunden werden. Dies führt zu einem Archiv, das den letzten von zurückgegebenen Chunckxargs
und nicht alle vomfind
Befehl gefundenen Ergebnisse enthält .Mögliche redundante Antwort, aber da ich sie nützlich fand, ist sie hier:
Als FreeBSD-Root (dh mit csh) wollte ich mein gesamtes Root-Dateisystem nach / mnt kopieren, aber ohne / usr und (offensichtlich) / mnt. Das hat funktioniert (ich bin bei /):
Mein ganzer Punkt ist, dass es notwendig war (durch Setzen der ./ ) anzugeben , dass die ausgeschlossenen Verzeichnisse, die Teil des größeren Verzeichnisses sind, kopiert werden sollen.
Meine € 0,02
quelle
Ich hatte kein Glück, Teer zu bekommen, um ein 5-Gigabyte-Unterverzeichnis mit einigen Tiefen auszuschließen. Am Ende habe ich nur den Unix-Zip-Befehl verwendet. Es hat viel einfacher für mich funktioniert.
Also für dieses spezielle Beispiel aus dem ursprünglichen Beitrag
(tar --exclude = '. / Folder' --exclude = '. / Upload / folder2' -zcvf /backup/filename.tgz.)
Das Äquivalent wäre:
(HINWEIS: Hier ist der Beitrag, den ich ursprünglich verwendet habe und der mir geholfen hat: /superuser/312301/unix-zip-directory-but-excluded-specific-subdirectories-and-everything-within-t )
quelle
zip
Packt keine leeren Verzeichnisse,tar
tut es aber !Hör zu
quelle
Ich möchte eine neue Front-End-Version (eckiger Ordner) auf localhost haben. Außerdem ist der Git-Ordner in meinem Fall riesig und ich möchte ihn ausschließen. Ich muss es vom Server herunterladen und entpacken, um die Anwendung auszuführen.
Komprimieren Sie den Winkelordner aus / var / lib / tomcat7 / webapps und verschieben Sie ihn in den Ordner / tmp mit dem Namen angle.23.12.19.tar.gz
Befehl :
quelle
Erfolgsfall: 1) Wenn Sie den vollständigen Pfad für die Sicherung angeben, sollte in exclude auch der vollständige Pfad verwendet werden.
tar -zcvf /opt/ABC/BKP_27032020/backup_27032020.tar.gz --exclude = '/ opt / ABC / csv / ' --exclude = '/ opt / ABC / log / ' / opt / ABC
2) Wenn Sie den aktuellen Pfad für die Sicherung angeben, sollte in exclude auch nur der aktuelle Pfad verwendet werden.
tar -zcvf backup_27032020.tar.gz --exclude = 'ABC / csv / ' --exclude = 'ABC / log / ' ABC
Fehlerfall:
Wenn Sie das Verzeichnis currentpath für die Sicherung und den vollständigen Pfad für die Ignorierung angeben, funktioniert dies nicht
tar -zcvf /opt/ABC/BKP_27032020/backup_27032020.tar.gz --exclude = '/ opt / ABC / csv / ' --exclude = '/ opt / ABC / log / ' ABC
Hinweis: Das Erwähnen von Ausschluss vor / nach dem Sicherungsverzeichnis ist in Ordnung.
quelle
Wenn Sie versuchen, VCS-Dateien (Version Control System) auszuschließen, unterstützt tar bereits zwei interessante Optionen! :) :)
Diese Option schließt Dateien und Verzeichnisse nach Versionskontrollsystemen verwendet:
CVS
,RCS
,SCCS
,SVN
,Arch
,Bazaar
,Mercurial
, undDarcs
.Ab Version 1.32 sind folgende Dateien ausgeschlossen:
CVS/
und alles darunterRCS/
und alles darunterSCCS/
und alles darunter.git/
und alles darunter.gitignore
.gitmodules
.gitattributes
.cvsignore
.svn/
und alles darunter.arch-ids/
und alles darunter{arch}/
und alles darunter=RELEASE-ID
=meta-update
=update
.bzr
.bzrignore
.bzrtags
.hg
.hgignore
.hgrags
_darcs
Wenn Verzeichnisse Archivierung , die unter einem Versionskontrollsystem (VCS) sind, ist es oft bequem Ausschluss Muster aus dieser VCS‘zu lesen ignorieren Dateien (zB
.cvsignore
,.gitignore
usw.) Diese Option solche Möglichkeit bieten.Bevor ein Verzeichnis der Archivierung sehen , ob es eine der folgenden Dateien enthält:
cvsignore
,.gitignore
,.bzrignore
, oder.hgignore
. Wenn ja, lesen Sie Ignoriermuster aus diesen Dateien.Die Muster werden ähnlich behandelt, wie das entsprechende VCS sie behandeln würde, dh:
.cvsignore
Enthält Globbing-Muster im Shell-Stil, die nur für das Verzeichnis gelten, in dem sich diese Datei befindet. In der Datei sind keine Kommentare zulässig. Leere Zeilen werden ignoriert.
.gitignore
Enthält Globbing-Muster im Shell-Stil. Gilt für das Verzeichnis, in dem
.gitfile
sich das Verzeichnis befindet, und alle seine Unterverzeichnisse.Jede Zeile, die mit a beginnt,
#
ist ein Kommentar. Backslash entgeht dem Kommentarzeichen..bzrignore
Enthält Shell-Globbing-Muster und reguläre Ausdrücke (wenn
RE:
(16) vorangestellt ist . Muster wirken sich auf das Verzeichnis und alle seine Unterverzeichnisse aus.Jede Zeile, die mit a beginnt,
#
ist ein Kommentar..hgignore
Enthält posix reguläre Ausdrücke (17). Die Linie
syntax: glob
wechselt zu Shell-Globbing-Mustern. Die Leitungsyntax: regexp
schaltet zurück. Kommentare beginnen mit a#
. Muster wirken sich auf das Verzeichnis und alle seine Unterverzeichnisse aus.tar -czv --exclude-vcs --exclude-vcs-ignores -f path/to/my-tar-file.tar.gz path/to/my/project/
quelle
Das folgende Bash-Skript sollte den Trick machen. Es verwendet die hier von Marcus Sundman gegebene Antwort .
Dadurch wird der benötigte Befehl ausgedruckt und Sie können ihn einfach kopieren und wieder einfügen. Es gibt wahrscheinlich eine elegantere Möglichkeit, ihn direkt in der Befehlszeile bereitzustellen.
Ändern Sie einfach * .CC für eine andere gebräuchliche Erweiterung, einen Dateinamen oder einen regulären Ausdruck, den Sie ausschließen möchten, und dies sollte weiterhin funktionieren.
BEARBEITEN
Nur um eine kleine Erklärung hinzuzufügen; find generiert eine Liste von Dateien, die dem ausgewählten regulären Ausdruck entsprechen (in diesem Fall * .CC). Diese Liste wird über xargs an den Befehl echo übergeben. Dies druckt - einen Eintrag aus der Liste ausschließen. Die Schrägstriche () sind Escapezeichen für die Markierungen.
quelle