Ich habe diese sehr einfache Linie in einem Bash - Skript , das erfolgreich ausführt (dh die Erzeugung _data.tar
Datei), mit der Ausnahme , dass es nicht der Fall ist , die Unterverzeichnisse ausschließen es gesagt wird über die ausschließen --exclude
Option:
/bin/tar -cf /home/_data.tar --exclude='/data/sub1/*' --exclude='/data/sub2/*' --exclude='/data/sub3/*' --exclude='/data/sub4/*' --exclude='/data/sub5/*' /data
Stattdessen wird eine _data.tar
Datei erstellt, die alles unter / data enthält, einschließlich der Dateien in den Unterverzeichnissen, die ich ausschließen wollte.
Irgendeine Idee warum? und wie kann man das beheben?
Update Ich habe meine Beobachtungen basierend auf dem Link implementiert, der in der ersten Antwort unten angegeben ist (oberste Ebene zuerst, kein Leerzeichen nach dem letzten Ausschluss):
/bin/tar -cf /home/_data.tar /data --exclude='/data/sub1/*' --exclude='/data/sub2/*' --exclude='/data/sub3/*' --exclude='/data/sub4/*' --exclude='/data/sub5/*'
Aber das hat nicht geholfen. Alle "ausgeschlossenen" Unterverzeichnisse sind in der resultierenden _data.tar
Datei vorhanden.
Das ist rätselhaft. Egal, ob dies ein Fehler in aktuellem tar (GNU tar 1.23, unter CentOS 6.2, Linux 2.6.32) oder eine "extreme Empfindlichkeit" von tar gegenüber Leerzeichen und anderen leicht zu übersehenden Tippfehlern ist, ich halte dies für einen Fehler. Zur Zeit.
Das ist schrecklich : Ich habe die unten vorgeschlagene Einsicht ausprobiert (kein Nachstellen /*
) und es funktioniert immer noch nicht im Produktionsskript:
/bin/tar -cf /home/_data.tar /data --exclude='/data/sub1' --exclude='/data/sub2' --exclude='/data/sub3' --exclude='/data/sub4'
Ich sehe keinen Unterschied zwischen dem, was ich versucht habe und dem, was @ Richard Perrin versucht hat, mit Ausnahme der Anführungszeichen und 2 Leerzeichen anstelle von 1. Ich werde dies versuchen (muss warten, bis das nächtliche Skript als zu sicherndes Verzeichnis ausgeführt wird) up is huge) und melde dich zurück.
/bin/tar -cf /home/_data.tar /data --exclude=/data/sub1 --exclude=/data/sub2 --exclude=/data/sub3 --exclude=/data/sub4
Ich beginne zu denken, dass all diese tar --exclude
Empfindlichkeiten nicht Teer sind, sondern etwas in meiner Umgebung, aber was könnte das dann sein?
Es funktionierte! Die letzte --exclude
getestete Variante (keine einfachen Anführungszeichen und ein Leerzeichen anstelle eines doppelten Leerzeichens zwischen den s) funktioniert. Seltsam, aber akzeptierend.
Nicht zu fassen! Es stellt sich heraus, dass eine ältere Version von tar
(1.15.1) nur ausschließen würde, wenn sich das oberste Verzeichnis zuletzt in der Befehlszeile befindet. Dies ist genau das Gegenteil von der Version 1.23. Zu Ihrer Information.
--exclude b
(Raum statt Gleichheitszeichen) vs.--exclude=b
. Macht das einen Unterschied? (sollte nicht IMHO)--exclude=
auf derselben Leitung. Der Unterschied muss also der Schwachsinn sein/*
, den ich an jedes Unterverzeichnis angehängt habe. Ich werde dies heute Abend im Produktionsskript testen und darüber berichten. Ein weiteres +1.Möglicherweise
tar
erfordert Ihre Version von , dass die--exclude
Optionen am Anfang destar
Befehls platziert werden müssen.Siehe: https://stackoverflow.com/q/984204
Siehe: http://mandrivausers.org/index.php?/topic/8585-multiple-exclude-in-tar/
Alternative:
Ein weiterer
tar
Befehlstipp ist von hier :quelle
--exclude=mydir/*
Ihrer Information , unter debian, Wenn ich den Filter nicht genau angebe, funktioniert er nicht (mittar --exclude=maindir/mydir/* -cjf archive.tar2.bz2 maindir/*
).tar --version
); debian wird im Laufe der Jahre vermutlich mit vielen verschiedenen Versionen von tar ausgeliefert.--exclude
vorher-czf
.Versuchen Sie, mehrere Dateien auszuschließen
Das spart Code und Kopfschmerzen. Dies ist eine globale Lösung für alle Arten von Programmen / Optionen. Wenn Sie auch das übergeordnete Verzeichnis in Ihre Auswahl aufnehmen möchten (in diesem Fall Daten), müssen Sie ein nachstehendes Komma einfügen. Z.B:
quelle
mv /very/very/very/very/long/path/to/a/file{,.bak}
Dieser Link könnte hilfreich sein. http://answers.google.com/answers/threadview/id/739467.html
Zwei unmittelbare Unterschiede zwischen der nicht funktionierenden Zeile und einigen Tipps im Link:
--exclude
.quelle
-MAK
erregte meine Aufmerksamkeit und bis jetzt konnte ich die folgenden Unterschiede zwischen meiner nicht arbeitenden Zeile und den folgenden feststellen: 1. Alle Ausschlüsse folgen nach dem Verzeichnis der obersten Ebene. 2. Nach dem letzten darf KEIN Leerzeichen stehen--exclude
. Ich werde diese Erkenntnisse testen und berichten. +1 für jetzt.Eine Problemumgehung kann darin bestehen, eine Kombination von
find ... -prune
undtar
zum Ausschließen der angegebenen Verzeichnisse zu verwenden.Unter Mac OS X scheint die
--exclude
Option von GNU jedochtar
so zu funktionieren, wie sie sollte.Im folgenden Testfall sollen die Verzeichnisse
/private/var/log/asl
und/private/var/log/DiagnosticMessages
aus einem komprimierten Archiv des/private/var/log
Verzeichnisses ausgeschlossen werden.quelle
Vielleicht können Sie den Befehl mit einer anderen Option versuchen:
Und prüfen Sie, ob es wie vorgesehen ausgeführt wird.
quelle
Ich benutze einen Mac und habe festgestellt, dass Ausschlüsse nur dann funktionieren, wenn der Ordner der obersten Ebene das letzte Argument ist
Beispiel eines Arbeitsbefehls:
Zu Ihrer Information:
quelle
In meinem Fall hat es aus einem anderen Grund nicht ausgeschlossen.
Der vollständige Pfad im Vergleich zum relativen Pfad.
Sowohl der Ausschluss als auch das Verzeichnis müssen dasselbe Pfadformat verwenden (dh beide vollständigen Pfade oder beide relativen Pfade).
Beispiel:
Dies funktioniert nicht, da beim Ausschließen der vollständige Pfad verwendet wird, während das Ziel einen relativen Pfad verwendet
Dies funktioniert, weil beide den vollständigen Pfad verwenden
Dies funktioniert, weil beide den relativen Pfad verwenden
quelle
Statt
--exclude=
Verwendung-X
mit einer Textdatei:http://www.cyberciti.biz/faq/exclude-certain-files-when-creating-a-tarball-using-tar-command/
quelle
Zusätzliche Anmerkungen zu R Perrins hervorragender Antwort :
Angenommen, Sie möchten keine absoluten, sondern relative Pfade archivieren, z. B. 'data' anstelle von '/ tmp / data'. Um absolute Pfade auszuschließen, unterscheiden sich Ihre tar-Argumente je nach der von Ihnen verwendeten tar-Implementierung (gnu tar vs. bsd tar):
quelle
Gerade erst auf Teer (GNU Teer) 1.29 erkannt
Dieser Aufruf schließt Archivdateien, die mit --exclude-from angegeben wurden, nicht aus:
Dieser Aufruf funktioniert korrekt:
Reihenfolge der Parameter ist wichtig!
quelle
Ich habe alle möglichen Kombinationen ausprobiert, einschließlich einiger der aufgelisteten Antworten, und konnte es einfach nicht schaffen, die aufgelisteten Dateien auszuschließen.
Als ich es satt hatte, die Antwort auf einen Fünf-Minuten-Job zu suchen, tat ich das Gegenteil: Ich erstellte ein Archiv der Ordner, die ich einschließen wollte .
Ich habe dazu ein Archiv erstellt und dieses dann hinzugefügt :
Ein paar Anmerkungen:
tar
(und nicht komprimiertes tar.tgz
/.tar.gz
) Archiv erstellen - Sie können es später mit komprimierengzip mybackup.tar
tar tvf mybackup.tar
.quelle