• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] tar und exclude?

roemi

Advanced Hacker
Von Oc2pus habe ich diesen Befehl zum kopieren der "Root Partition":
tar cfpl - --atime-preserve . | ( cd /ziel; tar xfp - --atime-preserve )
(http://www.linux-club.de/viewtopic.php?t=12777)

Das klappt auch wunderbar.
Nun habe ich Ihn mal angezapft, ob es möglich ist auch Verzeichnisse dabei zu übergehen.
Dazu kam dieser Vorschlag (nur ein Beispiel):
tar cvj --exclude CVS --exclude ".cvsignore" -f kmymoney-0.8.0.tar.bz2 kmymoney/*

Wenn ich das nun kombiniere komme ich auf:
tar cfpl --exclude auslassen - --atime-preserve . | ( cd /ziel; tar xfp - --atime-preserve )
Damit würde ich gerne die gesamte "Root Partition", mit einer Ausnahme, kopieren.

"man tar" hat mir dabei nicht wirklich geholfen.
Eher eine weitere Frage aufgeworfen. Heißt es nicht richtiger: --exclude file auslassen?

Stimmt meine Kombination?
 

TeXpert

Guru
ich muss gestehen, ich hab jetzt noch nicht so ganz Deine Argumentation verstanden :) aber ich versuch mal zu helfen ;

1. tar cf -
das ist eine IMHO dumme Kombination, warum ein (f)ile erstellen, wenn es doch (-) auf stdout geschrieben werden soll, also analog, lass (f) und(-) weg, denn tar schreibt per Default auf stdout und liest von stdin, dh
Code:
tar c pfad | (cd /ziel && tar x)
sind schon alles was man braucht (ohne Optionen jetzt...)

2. Exclude
man tar schrieb:
--exclude=MUSTER
Dateien auslassen, auf die MUSTER passt

-X, --exclude-from=DATEI
Dateien auslassen, auf die in DATEI angegebene Muster passen

d.h. ein --exclude="foo*" schließt alle Dateien und Verzeichnisse aus, die mit foo beginnen und irgendwie weitermachen. Die Quotes sind wichtig, da sonst die Shell den * schon expandieren will.

alternativ kannst Du eine Datei mit Dateien, die ignoriert werden sollen aufsetzen. Bei den Dateien reicht dann einmal nur der Name (ohne Slash am anfang) oder der komplette Pfad relativ zum Startpunkt des Tar-Befehls, d.h. wenn Du in /tmp stehst und /tmp/a taren willst und "tar c a" verwendest, dann reicht in der Exclude-Datei ein "a" um die Datei "a" auszuschließen, "/a/b" um die Datei b im Verzeichnis a auszuschließen, aber ein "/tmp/a/c" bewirkt nichts.
 
Hi Roemi,

ich vermute du musst "--exclude ./.cvsignore" angeben.
Wenn du "." sicherst werden die Files als ./<file> abgelegt.

Um den genauen Pattern zu finden kannst du dir, statt ein Restore ein "Inhaltsverzeichnis" über "-t" anzeigen lassen.
Beispiel:

tar -cf - . | tar -tvf - | grep .cvsignore

Damit findest du dann den Namen, den tar beim exclude gerne hätte.

Viele Grüße,

Haveaniceday
 

TeXpert

Guru
haveaniceday schrieb:
ich vermute du musst "--exclude ./.cvsignore" angeben.
Wenn du "." sicherst werden die Files als ./<file> abgelegt.

nein, das ist meiner Efahrung nach nicht nötig, bei das exclude matched vteilweise von hinten passt das auch auf ohne die führenden Verzeichnisse. so wird bei diesem Beispiel

Code:
/a/b
/a/d/b
/a/d/c
/a/b
/a/c
a und d sind Verzeichnisse, b, c Dateien

mit
Code:
tar c --exclude d /a | (cd /ziel && tar x)
das gesamte Verzeichnis "a/d/*" nicht mitgesichert. Für Dateien gilt das analog
 

oc2pus

Ultimate Guru
TeXpert schrieb:
...
1. tar cf -
das ist eine IMHO dumme Kombination, warum ein (f)ile erstellen, wenn es doch (-) auf stdout geschrieben werden soll, also analog, lass (f) und(-) weg, denn tar schreibt per Default auf stdout und liest von stdin, dh
Code:
tar c pfad | (cd /ziel && tar x)
sind schon alles was man braucht (ohne Optionen jetzt...) ...

siehst du roemi, wie ich vorrausgesagt habe, wenn TeXpert das sieht, wirst du eine noch pfiffigere Lösung bekommen ;)

@TeXpert
hau deine Verbesserung doch bitte auch noch in den Originalthread rein:
http://www.linux-club.de/viewtopic.php?t=12777
 
OP
roemi

roemi

Advanced Hacker
Sry, das ich mich erst jetzt melde.
1. Habe ich keine Nachricht wegen der Antworten bekommen
2. habe ich gestern bzw. heute mächtig gefeiert
3. Ist mein Magen gerade dabei zu überlegen wie er zur Aufnahme fester Nahrmittel steht.

Aua

Aber nun zum Wesendlichen. Ich möchte den Inhalt einer Platte fast kompl. auf eine andere verschieben. Ein "Verzeichnis" (und da habe ich bereits meinen ersten Fehler: dir und file verwechselt) soll bleiben wo es ist. Zudem ist das auch noch mit über 50 Gb das größte.

Ich glaube ich muss mir das noch 100x durchlesen.
Oder bis morgen warten.

Danke, ich komme wieder ... keine Frage
 
OP
roemi

roemi

Advanced Hacker
tar c --exclude=rpm * | (cd test && tar x)

Das klappt :D

Ich hab auch mal
tar c --exclude=rpm | (cd test && tar x)
probiert (also ohne Stern).

Da bekommt man diese geile Fehlermeldung:
tar: Anlegen eines leeren Archivs wird feige verweigert.
:D :D :D
Tar verhält sich also wie mein Magen. Der verweigert auch feige :?

Leider kopiert er keine versteckten Dateien. Aber das wird wohl ein lösbares Problem sein ....
 

TeXpert

Guru
was sollen die * und .* denn darstellen?

prinzipiell würde ich die Zeile eher so sehen:

Code:
tar c --exclude="/mntpnt/dasnicht" /mntpnt | ( .... )

Du willst eine Platte (die liegt auf einem Mountpoint) also
Code:
tar c /mntpnt
dabei soll das eine Verzeichnis ausgelassen werden also
Code:
--exclude="/mntpnt/dasnicht"
Die Sterne werden halt von der Bash expandiert... das kann u.u. schon man zu unerwünschten Situationen führen.

beim Kopieren von ganzen Dateisystemen kann es Sinnvoll sein auch noch
man tar schrieb:
-S, --sparse
löchrige Dateien (»sparse files«) effizient behandeln
zu verwenden.

u.U. möchtest Du weitere Dateisysteme dann noch auslassen (also lieber 1 Dateisystem nach dem anderen sichern)
man tar schrieb:
-l, --one-file-system
beim Erzeugen Dateisystem nicht wechseln

und dann evtl. wieder --atime-preserve wenn Du das brauchst.
 

oc2pus

Ultimate Guru
roemi schrieb:
...
Kleine Frage zwischendurch: Wieso hast Du eine deutsche "man tar"?

Ich werde kirre :wink: :wink: :wink:
und dann evtl. wieder --atime-preserve wenn Du das brauchst.

Dann wäre Oc2pussis Lösung doch in Ordnung?
dir gebe ich gleich eins für "Oc2pussi" ... und wieso hast du jemals an meinem TIP gezweifelt ;)

Die deutschen man-pages kannst du separat installieren ;)
 

TeXpert

Guru
roemi schrieb:
was sollen die * und .* denn darstellen?

* für alle Dateien
und
.* für alle versteckte Dateien
dann reicht das übergeordnete Verzeichnis doch aus :) also entweder / wenns ganz unten ist oder /foobar

Kleine Frage zwischendurch: Wieso hast Du eine deutsche "man tar"?

ich hab mir
Code:
manpages-de - German manpages
manpages-de-dev - German development manpages
installiert ;)

Ich werde kirre :wink: :wink: :wink:
und dann evtl. wieder --atime-preserve wenn Du das brauchst.

Dann wäre Oc2pussis Lösung doch in Ordnung?
im Prinzip passt die Lösung, ich hab ja nur mit --exclude und dem -f- angefangen ;) das --atime-preserve *kann* Sinn machen...
 
OP
roemi

roemi

Advanced Hacker
michael:/home/michael # tar c --exclude=rpm * .* | (cd test && tar x)
tar: Removing leading `..' from member names
tar: Removing leading `../' from member names
tar: Springe zum nächsten Kopfteil.
...
tar: Archiv enthält veraltete Base64-Kopfteile
tar: Springe zum nächsten Kopfteil.
...
tar: Springe zum nächsten Kopfteil.
tar: Fehler beim Beenden, verursacht durch vorhergehende Fehler.

Augenscheinlich kopiert er alles. Es kommt aber zu diesen Fehler.
Wobei ich, nach ein wenig google'n, nichts gefunden habe.
Gefunden schon, aber nicht das auf eine Katastophe hinweist. :wink:

Die Sterne bekomme ich, trotz deutscher Anleitung, nicht weg.
Lasse ich sie weg (zumindest in diesem Beispiel) funktioniert es garnicht.

Ich stehe im Beispiel im Home und kopiere in ein Verzeichnis Test, ebenfalls im Home.
 

oc2pus

Ultimate Guru
Code:
tar c --exclude=rpm . | (cd test && tar x)

probiere mal so :)

tar = Befehl
c = create
--exclude=xxx Option
. das was kopiert werden soll, also alles ab hier (du stehst ja im Quellverzeichnis!

.... etc
 

TeXpert

Guru
und als Alternative kann ich Dir auch noch ein
Code:
tar c --exclude=rpm /home/michael | ...
anbieten ;)
 
Oben