kopieren von Verzeichnissen mit symb. links
Hallo, gibt es einen Befehl, ein Verzeichnis mit Dateien in Unterverzeichnissen und mit symbolischen Links zu diesen Dateien in anderen Unterverzeichnissen zu archivieren/kopieren (mit cp, tar oder wie auch immer)? Also: /verzeichnis /unterverzeichnis 1 File 1 unterverzeichnis 2 symlink von File 1. Danke vorab. Poldi
Hallo, On Thu, 03 Oct 2002, Poldi Winkler wrote:
gibt es einen Befehl, ein Verzeichnis mit Dateien in Unterverzeichnissen und mit symbolischen Links zu diesen Dateien in anderen Unterverzeichnissen zu archivieren/kopieren (mit cp, tar oder wie auch immer)? Also: /verzeichnis /unterverzeichnis 1 File 1 unterverzeichnis 2 symlink von File 1.
Siehe Archiv, Thema Partitionen umziehen usw.: cd <quelle> tar cp --atime-preserve . | tar -C <ziel> xp --atime-preserve -dnh -- War damals doch gut hier vorbeizuschauen. All die hübschen Tischigungen mit dem gesunden Antackern. Die leckeren Froschpillen und das hübsche warme weisse Jäckchen. Der hübsche Friedhof mit meinem Ufo. Ach ja und meine Zelle. Ist doch gar nicht so schlecht in dag°. [WoKo in dag°]
Am Don, 2002-10-03 um 22.20 schrieb David Haller:
Hallo,
On Thu, 03 Oct 2002, Poldi Winkler wrote:
gibt es einen Befehl, ein Verzeichnis mit Dateien in Unterverzeichnissen und mit symbolischen Links zu diesen Dateien in anderen Unterverzeichnissen zu archivieren/kopieren (mit cp, tar oder wie auch immer)? Also: /verzeichnis /unterverzeichnis 1 File 1 unterverzeichnis 2 symlink von File 1.
Siehe Archiv, Thema Partitionen umziehen usw.:
cd <quelle> tar cp --atime-preserve . | tar -C <ziel> xp --atime-preserve
-dnh
Hallo David, hallo Thomas bin nicht sicher, ob ich Eure Befehle richtig verstanden habe, aber tar führt lediglich im backup-file zu symlinks auf das Original-file (tar -czf /ziel/file.tgz /quelle) . Zumindestens bei mir.
Hallo, On Fri, 04 Oct 2002, Poldi Winkler wrote:
Am Don, 2002-10-03 um 22.20 schrieb David Haller:
On Thu, 03 Oct 2002, Poldi Winkler wrote:
gibt es einen Befehl, ein Verzeichnis mit Dateien in Unterverzeichnissen und mit symbolischen Links zu diesen Dateien in anderen Unterverzeichnissen zu archivieren/kopieren (mit cp, tar oder wie auch immer)? cd <quelle> tar cp --atime-preserve . | tar -C <ziel> xp --atime-preserve
bin nicht sicher, ob ich Eure Befehle richtig verstanden habe, aber tar führt lediglich im backup-file zu symlinks auf das Original-file (tar -czf /ziel/file.tgz /quelle) . Zumindestens bei mir.
Tar kann auch nach stdout schreiben und von stdin lesen. Und genau das wird open gemacht. Explizit geschrieben: tar cpf - . | tar -C <ziel> xpf - Das .tar zwischendrin ist nicht notwendig. Falls du aber _absolute_ symlinks auch anpassen willst, dann musst du das selbst machen, tar aendert die Ziele der symlinks natuerlich nicht, also wenn ein symlink '/quelle/foo -> /irgendwo/bar' ist, dann gilt nach dem kopieren '/ziel/foo -> /irgendwo/bar'. Relative links passen aber, wenn du z.B.: /quelle/bin/foo -> ../lib/foo/bin/foo /quelle/lib/foo/bin/foo wie oben kopierts, dann gilt anschliessend: /ziel/bin/foo -> ../lib/foo/bin/foo /ziel/lib/foo/bin/foo und der symlinks "passt" noch. Hast du aber einen absoluten symlink /quelle/bin/foo -> /quelle/lib/foo/bin/foo /quelle/lib/foo/bin/foo dann gilt nach dem kopieren: /ziel/bin/foo -> /quelle/lib/foo/bin/foo /ziel/lib/foo/bin/foo und ob es /quelle/lib/foo/bin/foo noch gibt kommt dann darauf an, ob's /quelle spaeter noch gibt (geben wird). Und nein, dass das Ziel von /ziel/bin/foo umgesetzt wird, das macht weder cp noch tar noch cpio oder afio... Das muesstest du selber (per script) machen. -dnh -- 48: Nutzt die neuen Möglichkeiten von Windows'95! Haben Sie unser anderes Update schon gekauft? (Kristian Köhntopp)
On Fre, 04 Okt 2002 at 23:40 (+0200), David Haller wrote:
On Fri, 04 Oct 2002, Poldi Winkler wrote:
Am Don, 2002-10-03 um 22.20 schrieb David Haller:
On Thu, 03 Oct 2002, Poldi Winkler wrote:
gibt es einen Befehl, ein Verzeichnis mit Dateien in Unterverzeichnissen und mit symbolischen Links zu diesen Dateien in anderen Unterverzeichnissen zu archivieren/kopieren (mit cp, tar oder wie auch immer)? cd <quelle> tar cp --atime-preserve . | tar -C <ziel> xp --atime-preserve
bin nicht sicher, ob ich Eure Befehle richtig verstanden habe, aber tar führt lediglich im backup-file zu symlinks auf das Original-file (tar -czf /ziel/file.tgz /quelle) . Zumindestens bei mir.
Tar kann auch nach stdout schreiben und von stdin lesen. Und genau das wird open gemacht. Explizit geschrieben:
tar cpf - . | tar -C <ziel> xpf -
Das .tar zwischendrin ist nicht notwendig. [...] Und nein, dass das Ziel von /ziel/bin/foo umgesetzt wird, das macht weder cp noch tar noch cpio oder afio... Das muesstest du selber (per script) machen. [...]
Auch hier kann man dem verkannten cpio wieder zu Ehren verhelfen ;-) Der macht zwar auch kein Umsetzen der Links (sowas ist für Backups / Archive ja auch ziemlich tödlich), aber man kann mit 2 Schritten (ohne die Symlinks erst *falsch* im Zielsystem anlegen zu müssen) das Dateisystem klonen: # 1. Schritt: alles was nicht symlink ist kopieren: cd quelle find . -not -type l -print | cpio -pdm ziel # 2. Schritt: symlinks holen: find . -type l -print | while read i; do q=`readlink $i | sed 's#^quelle#ziel#'` ln -s $q ziel/$i done Es hat mir keine Ruhe gelassen, also habe ich mir eine Beispielumgebung gebastelt ;-): jan@k500:~/tmp/quelle> tree . |-- a | |-- c | | `-- alink -> /home/jan/tmp/quelle/b/datei | `-- rlink -> ../b/datei `-- b `-- datei 3 directories, 3 files Nach dem ersten Schritt sieht das so aus (lange Zeilen umgebrochen): jan@k500:~/tmp/quelle> find . -not -type l -print | cpio -pdm \ /home/jan/tmp/ziel/ 0 blocks jan@k500:~/tmp/quelle> tree ../ziel ../ziel |-- a | `-- c `-- b `-- datei 3 directories, 1 file Und dann der 2. Streich (lange Zeilen umgebrochen): jan@k500:~/tmp/quelle> find . -type l -print | while read i; do
q=`readlink $i | sed \ 's#^/home/jan/tmp/quelle#/home/jan/tmp/ziel#'` ln -s $q /home/jan/tmp/ziel/$i done jan@k500:~/tmp/quelle> tree ../ziel ../ziel |-- a | |-- c | | `-- alink -> /home/jan/tmp/ziel/b/datei | `-- rlink -> ../b/datei `-- b `-- datei
3 directories, 3 files Weiterführende Literatur *g*: man find man cpio man readlink man sed man ln man bash Jan
Hallo, On Sat, 05 Oct 2002, Jan Trippler wrote:
On Fre, 04 Okt 2002 at 23:40 (+0200), David Haller wrote: [...]
Und nein, dass das Ziel von /ziel/bin/foo umgesetzt wird, das macht weder cp noch tar noch cpio oder afio... Das muesstest du selber (per script) machen. [...]
Auch hier kann man dem verkannten cpio wieder zu Ehren verhelfen ;-) Der macht zwar auch kein Umsetzen der Links (sowas ist für Backups / Archive ja auch ziemlich tödlich), aber man kann mit 2 Schritten (ohne die Symlinks erst *falsch* im Zielsystem anlegen zu müssen) das Dateisystem klonen:
# 1. Schritt: alles was nicht symlink ist kopieren: cd quelle find . -not -type l -print | cpio -pdm ziel
# 2. Schritt: symlinks holen: find . -type l -print | while read i; do q=`readlink $i | sed 's#^quelle#ziel#'` ln -s $q ziel/$i done
Och, das geht auch allgemein ;) Hab jetzt aber keine Lust da jetzt z.B. mit tar zu testen... -dnh, dem afio sympatischer als cpio ist ;) -- 11: Swapspace Raubkopierertreffen (Kristian Köhntopp)
On Sam, 05 Okt 2002 at 15:36 (+0200), David Haller wrote:
On Sat, 05 Oct 2002, Jan Trippler wrote: [...]
# 1. Schritt: alles was nicht symlink ist kopieren: cd quelle find . -not -type l -print | cpio -pdm ziel
# 2. Schritt: symlinks holen: find . -type l -print | while read i; do q=`readlink $i | sed 's#^quelle#ziel#'` ln -s $q ziel/$i done
Och, das geht auch allgemein ;) Hab jetzt aber keine Lust da jetzt z.B. mit tar zu testen...
So? Zeigen! *fg* Der fundamentale Unterschied zwischen cpio und tar ist: cpio liest die Liste der _Dateinamen_ von stdin, tar höchstens die _Inhalte_ der Dateien. Du kannst ähnliche Sachen wie Schritt 1 natürlich mit tar machen, brauchst dazu aber IMHO mindestens einen zusätzlichen Schritt: Das Erzeugen einer Dateiliste als (temp.) Datei. Schritt 2 ist eh unabhängig von tar, cpio und Co. - ich wüsste nicht, wie man das Neuanlegen von Links mit diesen Mitteln hinkriegen sollte.
-dnh, dem afio sympatischer als cpio ist ;)
Geschmackssache. cpio treibt sich auf vielen Unixen rum, afio AFAIK nicht ;-) Jan
Hallo, On Sun, 06 Oct 2002, Jan Trippler wrote:
On Sam, 05 Okt 2002 at 15:36 (+0200), David Haller wrote:
On Sat, 05 Oct 2002, Jan Trippler wrote: [...]
# 1. Schritt: alles was nicht symlink ist kopieren: cd quelle find . -not -type l -print | cpio -pdm ziel
# 2. Schritt: symlinks holen: find . -type l -print | while read i; do q=`readlink $i | sed 's#^quelle#ziel#'` ln -s $q ziel/$i done
Och, das geht auch allgemein ;) Hab jetzt aber keine Lust da jetzt z.B. mit tar zu testen...
So? Zeigen! *fg*
Aber gern! /tmp/test $ ls -lR quelle ziel quelle: total 4 -rw-r--r-- 1 dh dh 0 Oct 6 05:50 a -rw-r--r-- 1 dh dh 0 Oct 6 05:50 b lrwxrwxrwx 1 dh dh 1 Oct 6 05:50 c -> a lrwxrwxrwx 1 dh dh 18 Oct 6 05:53 d -> /tmp/test/quelle/b drwxr-xr-x 2 dh dh 4096 Oct 6 05:54 dir quelle/dir: total 0 -rw-r--r-- 1 dh dh 0 Oct 6 05:54 e -rw-r--r-- 1 dh dh 0 Oct 6 05:54 f lrwxrwxrwx 1 dh dh 18 Oct 6 05:54 g -> /tmp/test/quelle/a ziel: total 0 /tmp/test $ cd quelle /tmp/test/quelle $ find . -type f -print0 | tar cp --null -T - \ | tar xp -C /tmp/test/ziel/ /tmp/test/quelle $ cd .. /tmp/test $ ls -lR ziel ziel: total 4 -rw-r--r-- 1 dh dh 0 Oct 6 05:50 a -rw-r--r-- 1 dh dh 0 Oct 6 05:50 b drwxr-xr-x 2 dh dh 4096 Oct 6 06:04 dir ziel/dir: total 0 -rw-r--r-- 1 dh dh 0 Oct 6 05:54 e -rw-r--r-- 1 dh dh 0 Oct 6 05:54 f Schritt 2 wie oben. Noch Fragen? Alternativ geht uebrigens auch: find . -not -type l -print0 | tar cp --null -T - --no-recursion \ | tar xp -C /tmp/test/ziel/ Und statt -print0 | tar cp --null -T - muesste auch '-print | tar cp -T -' klappen, aber das habe ich jetzt nicht getestet.
Der fundamentale Unterschied zwischen cpio und tar ist: cpio liest die Liste der _Dateinamen_ von stdin, tar höchstens die _Inhalte_ der Dateien. Du kannst ähnliche Sachen wie Schritt 1 natürlich mit tar machen, brauchst dazu aber IMHO mindestens einen zusätzlichen Schritt: Das Erzeugen einer Dateiliste als (temp.) Datei.
Nein. s.o. tar -T liest Dateinamen aus einer Datei. Und diese kann eben auch /dev/stdin sein (was wie bei tar ueblich als '-' angegeben werden kann) -- warum auch nicht! Man lese 'tar --help' *fg*
Schritt 2 ist eh unabhängig von tar, cpio und Co. - ich wüsste nicht, wie man das Neuanlegen von Links mit diesen Mitteln hinkriegen sollte.
Genau.
-dnh, dem afio sympatischer als cpio ist ;)
Geschmackssache. cpio treibt sich auf vielen Unixen rum, afio AFAIK nicht ;-)
Ack. -dnh --
Ach was, so ein bisschen Strom macht doch einem alten Elektriker nichts aus.. ...jaja, *sicherungsrausdreh* *reinlang* "Jo, dor is Strom in" -- cmt und MOW in dasr
On Son, 06 Okt 2002 at 06:15 (+0200), David Haller wrote:
On Sun, 06 Oct 2002, Jan Trippler wrote:
On Sam, 05 Okt 2002 at 15:36 (+0200), David Haller wrote:
On Sat, 05 Oct 2002, Jan Trippler wrote: [...]
# 1. Schritt: alles was nicht symlink ist kopieren: cd quelle find . -not -type l -print | cpio -pdm ziel
# 2. Schritt: symlinks holen: find . -type l -print | while read i; do q=`readlink $i | sed 's#^quelle#ziel#'` ln -s $q ziel/$i done
Och, das geht auch allgemein ;) Hab jetzt aber keine Lust da jetzt z.B. mit tar zu testen...
So? Zeigen! *fg*
Aber gern! [...] /tmp/test $ cd quelle /tmp/test/quelle $ find . -type f -print0 | tar cp --null -T - \ | tar xp -C /tmp/test/ziel/ [...]
Ah, auf die Idee bin ich nicht gekommen! Aber wenn man es sieht, dann ist es einleuchtend, der Option -T stdin vorzusetzen. BTW: Den find würde ich aber doch mit -not -type l absetzen, sonst erwischst Du Devices und Named Pipes nicht. Man könnte zwar auch mit find . -type f -o -type c -o -type b ... arbeiten, das wird aber schnell unübersichtlich, vor allem dann, wenn man zusätzliche Optionen hat - -mount z. B. macht sich oft gut, wenn sich andere Dateisysteme innerhalb des zu sichernden Pfades befinden - dann muss man nämlich klammern: find . \( -type f -o -type c -o -type b \) -mount ...
Alternativ geht uebrigens auch:
find . -not -type l -print0 | tar cp --null -T - --no-recursion \ | tar xp -C /tmp/test/ziel/
Die Option --no-recursion taucht übrigens nicht im Manual auf. Wenn ich es recht verstehe, würden ohne sie Dateien in den Unterverzeichnissen doppelt kopiert werden, da sie einmal durch find gemeldet werden und dann noch durch den (rekursiv arbeitenden) tar archiviert werden, korrekt? Dem kann man durch einen erweiterten find begegnen: find . -not \( -type l -o -type d \) ...
Und statt -print0 | tar cp --null -T - muesste auch '-print | tar cp -T -' klappen, aber das habe ich jetzt nicht getestet.
IMHO ist doch der Unterschied nur die korrekte Behandlung von Dateinamen mit Zeilenumbruch, oder?
Der fundamentale Unterschied zwischen cpio und tar ist: cpio liest die Liste der _Dateinamen_ von stdin, tar höchstens die _Inhalte_ der Dateien. Du kannst ähnliche Sachen wie Schritt 1 natürlich mit tar machen, brauchst dazu aber IMHO mindestens einen zusätzlichen Schritt: Das Erzeugen einer Dateiliste als (temp.) Datei.
Nein. s.o. tar -T liest Dateinamen aus einer Datei. Und diese kann eben auch /dev/stdin sein (was wie bei tar ueblich als '-' angegeben werden kann) -- warum auch nicht! Man lese 'tar --help' *fg*
Ja ja, ich habs ja geschnallt ;-) Aber mal ehrlich: Ist die Zeile mit cpio nicht wesentlich kürzer und übersichtlicher anzuschauen (mal abgesehen davon, dass da nur 1 Pipe und nur 1 Kommando neben dem find nötig ist)? Abgesehen davon ist es beeindruckend zu sehen, wie leistungsfähig GNU tar ist. Jan
Hallo, On Sun, 06 Oct 2002, Jan Trippler wrote:
On Son, 06 Okt 2002 at 06:15 (+0200), David Haller wrote:
On Sun, 06 Oct 2002, Jan Trippler wrote:
On Sam, 05 Okt 2002 at 15:36 (+0200), David Haller wrote:
On Sat, 05 Oct 2002, Jan Trippler wrote: [...]
# 1. Schritt: alles was nicht symlink ist kopieren: cd quelle find . -not -type l -print | cpio -pdm ziel
# 2. Schritt: symlinks holen: find . -type l -print | while read i; do q=`readlink $i | sed 's#^quelle#ziel#'` ln -s $q ziel/$i done
Och, das geht auch allgemein ;) Hab jetzt aber keine Lust da jetzt z.B. mit tar zu testen...
So? Zeigen! *fg*
Aber gern! [...] /tmp/test $ cd quelle /tmp/test/quelle $ find . -type f -print0 | tar cp --null -T - \ | tar xp -C /tmp/test/ziel/ [...]
Ah, auf die Idee bin ich nicht gekommen! Aber wenn man es sieht, dann ist es einleuchtend, der Option -T stdin vorzusetzen.
*hehe* Eine Datei ist eine Datei ist eine Datei oder auch ein Verzeichnis oder eine Pipe oder ein FIFO oder ein Socket oder... *g* (ok, tar -T wird die Dateinamen kaum aus nem Verzeichnis lesen, der Rest geht aber ;)
BTW: Den find würde ich aber doch mit -not -type l absetzen, sonst erwischst Du Devices und Named Pipes nicht. Man könnte zwar auch mit find . -type f -o -type c -o -type b ... arbeiten, das wird aber schnell unübersichtlich, vor allem dann, wenn man zusätzliche Optionen hat - -mount z. B. macht sich oft gut, wenn sich andere Dateisysteme innerhalb des zu sichernden Pfades befinden - dann muss man nämlich klammern: find . \( -type f -o -type c -o -type b \) -mount ...
Ack.
Alternativ geht uebrigens auch:
find . -not -type l -print0 | tar cp --null -T - --no-recursion \ | tar xp -C /tmp/test/ziel/
Die Option --no-recursion taucht übrigens nicht im Manual auf.
Nicht? *tstst* Ich hab hier eh nur(!) ein deutsches 'man tar', und das ist (mal wieder) unvollstaendig. Im englischen 'info tar' taucht '--no-recursion' sehr wohl auf. Und authoritativ was vorhandene Optionen angeht ist immer '--help' ;)
Wenn ich es recht verstehe, würden ohne sie Dateien in den Unterverzeichnissen doppelt kopiert werden, da sie einmal durch find gemeldet werden und dann noch durch den (rekursiv arbeitenden) tar archiviert werden, korrekt?
Jup.
Dem kann man durch einen erweiterten find begegnen: find . -not \( -type l -o -type d \) ...
Jup. Oder eben mit dem '--no-recursion', s.o. die 2te Variante von mir.
Und statt -print0 | tar cp --null -T - muesste auch '-print | tar cp -T -' klappen, aber das habe ich jetzt nicht getestet.
IMHO ist doch der Unterschied nur die korrekte Behandlung von Dateinamen mit Zeilenumbruch, oder?
Fast. Das gilt (AFAIK) fuer alle Dateinamen mit Zeichen aus $IFS. Also auch Leerzeichen, Tab oder was auch immer gerade in IFS steht (z.B. ein Doppelpunkt ;) Gerade aber bei Backups denke ich ist es vorteilhaft ASCII NULL als (einziges) Trennzeichen von Dateinamen zu verwenden... Ah, 'info cpio' verraet mir gleich als erste Option: ==== Options ======= `-0, --null' Read a list of filenames terminated by a null character, instead of a newline, so that files whose names contain newlines can be archived. GNU find is one way to produce a list of null-terminated filenames. This option may be used in copy-out and copy-pass modes. ====
Der fundamentale Unterschied zwischen cpio und tar ist: cpio liest die Liste der _Dateinamen_ von stdin, tar höchstens die _Inhalte_ der Dateien. Du kannst ähnliche Sachen wie Schritt 1 natürlich mit tar machen, brauchst dazu aber IMHO mindestens einen zusätzlichen Schritt: Das Erzeugen einer Dateiliste als (temp.) Datei.
Nein. s.o. tar -T liest Dateinamen aus einer Datei. Und diese kann eben auch /dev/stdin sein (was wie bei tar ueblich als '-' angegeben werden kann) -- warum auch nicht! Man lese 'tar --help' *fg*
Ja ja, ich habs ja geschnallt ;-) Aber mal ehrlich: Ist die Zeile mit cpio nicht wesentlich kürzer und übersichtlicher anzuschauen (mal abgesehen davon, dass da nur 1 Pipe und nur 1 Kommando neben dem find nötig ist)? Abgesehen davon ist es beeindruckend zu sehen, wie leistungsfähig GNU tar ist.
Jo. Allerdings geht's z.B. zumindest mir so, dass ich das find meist nicht brauche, und tar einfach auch besser kenne... Siehe z.B. das Thema "Partition kopieren" usw... ;) Tar verwende _ich_ halt fast "instinktiv" und praktisch taeglich, bei cpio muss ich immer alles nachlesen ;) Ja, ich weiss, das liegt v.a. nur an mir, nicht an cpio *g* 'tar' ist aber halt auch ein Standard Archivprogramm, in dem fast jede Software fuer *nix daherkommt ;) Und nein, fuer komprimierte _Backups_ ist tar IMO nicht geeignet, da nur ein gekipptes Bit einen ganzen Kompressions-Block (oder gar das ganze Archiv?) kaputt macht, weswegen ich dafuer auch afio verwende... Andererseits kann eben diese Eigenart auch ein Vorteil sein, z.B. um eine einfache Kontrolle zur Datenintegritaet zu haben oder wenn es _mehrere_ aehnliche Dateien sind: da faellt mir naemlich noch was nettes zu tar ein: ich habe neulich mal Spielstaende via Diskette transferieren wollen... Ich stell's mal nach: $ cd /tmp/test/tar $ ls -l total 10676 -rw-r--r-- 1 dh dh 295823 Aug 15 16:34 save000.mm6 [..] -rw-r--r-- 1 dh dh 296098 Aug 15 16:27 save039.mm6 $ du -hs . 10M . $ bzip2 -9 * $ du -hs . 6.2M . $ bunzip2 * $ tar cIf saves.tar.bz2 * $ du -h saves.tar.bz2 3.1M saves.tar.bz2 Da schlaegt dann die Redundanz zwischen den einzelnen save0* zu, die durch die grossen Bloecke von bz2 beim .tar zum Tragen kommen kann, aber nicht bei den einzelnen Dateien. Im Durchschnitt werden da wohl je 3 Dateien gemeinsam komprimiert und da sie sich nur wenig unterscheiden (Spielstaende teilw. im Minutenabstand), kann bzip2 dann die Bloecke zusammen komprimieren und so entsprechend besser komprimieren... Hm. Man muesste bzip2 mal so aufbohren, dass auch noch groessere Bloecke als 900kb moeglich sind, da koennte obiges Beispiel dann wohl nochmal deutlich kleiner werden ;)) In der Praxis war obiges fuer mich bedeutend, denn mit tar reichten mir: $ echo "scale=2; `du -sk saves.tar.bz2 | cut -d' ' -f1` / 1759" | bc 1.78 mit 1760kb formatierte Disketten (die ich hatte), ohne haette ich $ echo "scale=2; `du -sk . | cut -d' ' -f1` / 1759" | bc 3.63 Disketten gebraucht... (die ich nicht hatte ;) Praktisch habe ich dann aber 2 Archive gemacht (jew. so, dass das tar.bz2 noch auf eine Diskette passte) und nicht split verwendet... Bei der Variante (ein Archiv / Diskette) haben mir mit tar immer noch 2 Disketten gereicht, ohne tar haette ich IIRC 6 Disketten benoetigt... Ohem... Warum erzaehl ich das alles??? Achja, *g*, JEDES der 3 genannten Tools (tar/cpio/afio) hat seine Vor- und seine Nachteile und seine Anwendungsfaelle! "Die Kunst"[tm] ist wohl, das fuer den jeweiligen Anwendungsfall am besten geeignete auszuwaehlen, wobei ich hoffe, dass dieser Thread ein wenig Hilfestellung geben konnte/kann, das jeweils geeignete Programm auszuwaehlen :) -dnh, *gnihihi* good sigmonster, have a cookie! -- There is a green, multi-legged creature crawling on your shoulder.
Hallo Jan und David, jetzt habe ich mal weiter versucht, Euch zu verstehen, aber der Erfolg ist begrenzt. Eins denke ich ist klar, beim Kopieren der symlinks mit tar -czf bleibt der Bezug der symlinks of die Original-Verzeichnisse und es entsteht kein symlink auf die backup-directories. Wenn ich das unbedingt will, muß ich ein Script schreiben, das die neuen symlinks einzeln setzt. Da ich auf CD keine symlinks schreiben kann, ist das eigentlich auch notwendig, wenn ich mal wieder die Platten total ersetze, denn in diesem Falle habe ich diese verlinkten Dateien bisher immer verloren. Also danke Euch beiden und auch den anderen! Gruß Poldi
Hallo, On Sun, 06 Oct 2002, Poldi Winkler wrote:
Hallo Jan und David, jetzt habe ich mal weiter versucht, Euch zu verstehen, aber der Erfolg ist begrenzt.
Naja, Jan und ich driften gern mal ein wenig in Spezialitaeten ab ;)
Eins denke ich ist klar, beim Kopieren der symlinks mit tar -czf bleibt der Bezug der symlinks of die Original-Verzeichnisse und es entsteht kein symlink auf die backup-directories.
Korrekt.
Wenn ich das unbedingt will, muß ich ein Script schreiben, das die neuen symlinks einzeln setzt.
Korrekt.
Da ich auf CD keine symlinks schreiben kann,
Doch kannst du, mittels "Rock-Ridge"-Extensions, siehe dazu 'man mkisofs' und als Beispiel die SuSE-CDs /full-names/... (oder gibt's das nimmer?).
ist das eigentlich auch notwendig, wenn ich mal wieder die Platten total ersetze, denn in diesem Falle habe ich diese verlinkten Dateien bisher immer verloren.
Also, wenn das ein Backup werden soll, dann willst du ja eigentlich gar nicht, dass die symlinks auf die CD zeigen... Was du in dem Falle willst sind symlinks, die auch nach dem "Restore" wieder passen, oder? Generell ist es also meist sinnvoller relative symlinks zu verwenden, da diese dann sowohl auf der CD als auch vor und nach dem "Restore" stimmen, da hast du das Problem der "baumelnden" symlinks garnicht und kannst die bequem mit tar/cpio/afio/mkisofs mit wegsichern... Die absoluten symlinks kannst du uebrigens z.B. mit find + readlink + grep finden: find /quelle/ -type l | while read link; do readlink "$link" | grep -q '^/' && echo "$link" done HTH, -dnh -- 136: Deadline Programmtod durch überhastete Weiterentwicklung eines falsch konstruierten Entwurfsmusters. (Lutz Donnerhacke)
On Son, 06 Okt 2002 at 15:00 (+0200), David Haller wrote:
On Sun, 06 Oct 2002, Poldi Winkler wrote:
Hallo Jan und David, jetzt habe ich mal weiter versucht, Euch zu verstehen, aber der Erfolg ist begrenzt.
Naja, Jan und ich driften gern mal ein wenig in Spezialitaeten ab ;)
aber immer nur 'n bischen *g* [...]
Die absoluten symlinks kannst du uebrigens z.B. mit find + readlink + grep finden:
find /quelle/ -type l | while read link; do readlink "$link" | grep -q '^/' && echo "$link" done
*räusper* Nicht nur der GNU tar ist klasse, auch der GNU find: find /quelle -type l -printf "%l = %p\n" | grep '^/' Jan
Hallo, On Sun, 06 Oct 2002, Jan Trippler wrote:
On Son, 06 Okt 2002 at 15:00 (+0200), David Haller wrote:
Die absoluten symlinks kannst du uebrigens z.B. mit find + readlink + grep finden:
find /quelle/ -type l | while read link; do readlink "$link" | grep -q '^/' && echo "$link" done
*räusper*
*hust*
Nicht nur der GNU tar ist klasse, auch der GNU find: find /quelle -type l -printf "%l = %p\n" | grep '^/'
Naja, da ist dann wiederrum das auswerten schwieriger, da vorne die unterschiedlich langen links stehen... Besser vielleicht: find /quelle/ -type l -printf "%l\0%p\n" \ | awk -F'\0' '/^\//{print $2;}' -dnh -- 46: Schulversion legalisierte Raubkopie (Kristian Köhntopp)
On Son, 06 Okt 2002 at 13:37 (+0200), Poldi Winkler wrote:
jetzt habe ich mal weiter versucht, Euch zu verstehen, aber der Erfolg ist begrenzt. Eins denke ich ist klar, beim Kopieren der symlinks mit tar -czf bleibt der Bezug der symlinks of die Original-Verzeichnisse und es entsteht kein symlink auf die backup-directories. Wenn ich das unbedingt will, muß ich ein Script schreiben, das die neuen symlinks einzeln setzt. Da ich auf CD keine symlinks schreiben kann, ist das eigentlich auch notwendig, wenn ich mal wieder die Platten total ersetze, denn in diesem Falle habe ich diese verlinkten Dateien bisher immer verloren.
- _Kein_ uns bekanntes Tool zum Archivieren / Kopieren (tar, cpio, afio, ...) kann symbolische Links umsetzen. - symbolische Links mit relativen Pfaden machen in der Regel kein Problem - In meiner Mail habe ich (Schritt 2) so eine Schleife gezeigt, die das Umsetzen von Symlinks mit absoluten Pfaden erledigt. Das funktioniert natürlich nur für Dateisysteme, die Symlinks unterstützen. # 2. Schritt: symlinks holen: find . -type l -print | while read i; do q=`readlink $i | sed 's#^quelle#ziel#'` ln -s $q ziel/$i done zur Erläuterung: find holt alle Dateien vom Typ symbolischer Link; die while-Schleife arbeitet nacheinander jeden gefundenen Dateinamen ab (der über den read in der Variablen $i landet); die nächste Zeile ermittelt zunächst den Inhalt des Links (readlink) und ersetzt darin den Quellpfad durch den Zielpfad (wenn dieser am Anfang des Pfades auftritt); als Besonderheit benutze ich # statt / im sed, da / ja auch Bestandteil der Pfade sein können. Zuletzt wird der Link mit neuem Inhalt im Zielverzeichnis wieder hergestellt (ln). - Wenn das Zieldateisystem keine Symlinks unterstützt, dann musst Du diese mit anderen Mitteln sichern. Es bietet sich eine Archivdatei an, in der alle Symlinks stehen (ungetestet): find . -type l -print | tar -cf /ziel/symlinks.tar -T - lt. Tipp von David, in dem Fall IMHO besser als cpio ;-) (Option -p = --preserve-permissions sollte hier überflüssig sein, da bei einem Symlink immer die Rechte des Ziels entscheiden) Jan P.S.: Die Funktion der Schleife hätte sich eigentlich beim Blättern in den Manual-Pages der einzelnen Kommandos erschließen sollen - so kompliziert ist die nicht. Dass Du auf CD sichern willst, solltest Du beim nächsten Mal gleich schreiben.
Hallo, On Sun, 06 Oct 2002, Jan Trippler wrote:
- Wenn das Zieldateisystem keine Symlinks unterstützt, dann musst Du diese mit anderen Mitteln sichern. Es bietet sich eine Archivdatei an, in der alle Symlinks stehen (ungetestet):
Jup.
find . -type l -print | tar -cf /ziel/symlinks.tar -T - lt. Tipp von David, in dem Fall IMHO besser als cpio ;-)
Da enthalte ich mich ;) Klappen sollte es :)
(Option -p = --preserve-permissions sollte hier überflüssig sein, da bei einem Symlink immer die Rechte des Ziels entscheiden)
Korrekt. Die Symlinks haben _IMMER_ "777 root.root". Relevant sind _immer_ _NUR_ die Rechte des Ziels des Symlinks. -dnh -- He's wandering the wilds of West Buttfsck, administering a little personal attention to Jenny L. User [family motto: "My ISBN isn't working"]. -- K.T. Wiegman
On Sun, 6 Oct 2002, Jan Trippler wrote:
- _Kein_ uns bekanntes Tool zum Archivieren / Kopieren (tar, cpio, afio, ...) kann symbolische Links umsetzen.
warum wendest du nicht deine eigenen "Tools" dafuer an ;-) find /quelle -type l -printf "cp -r %l /tmp/%p\n"|grep '^cp -r /'|sh (vielleciht noch ein mkdir -p reinfummeln)
On 6 Oct 2002 at 22:36, Achim Hoffmann wrote:
On Sun, 6 Oct 2002, Jan Trippler wrote:
- _Kein_ uns bekanntes Tool zum Archivieren / Kopieren (tar, cpio, afio, ...) kann symbolische Links umsetzen.
warum wendest du nicht deine eigenen "Tools" dafuer an ;-)
Das habe ich getan - einige Tage + Mails vorher im gleichen Thread.
find /quelle -type l -printf "cp -r %l /tmp/%p\n"|grep '^cp -r /'|sh
Das ist allerdings ein interessanter Vorschlag, aber keine Lösung. Du kopierst die Ziele der Links nach tmp - was soll das für die ursprüngliche Frage bringen? Jan
markieren wir diese Antwort als **off-topic** On Thu, 7 Oct 2002, Jan Trippler wrote:
On 6 Oct 2002 at 22:36, Achim Hoffmann wrote:
On Sun, 6 Oct 2002, Jan Trippler wrote:
- _Kein_ uns bekanntes Tool zum Archivieren / Kopieren (tar, cpio, afio, ...) kann symbolische Links umsetzen.
warum wendest du nicht deine eigenen "Tools" dafuer an ;-)
Das habe ich getan - einige Tage + Mails vorher im gleichen Thread.
LOL
find /quelle -type l -printf "cp -r %l /tmp/%p\n"|grep '^cp -r /'|sh
Das ist allerdings ein interessanter Vorschlag, aber keine Lösung. Du kopierst die Ziele der Links nach tmp - was soll das für die ursprüngliche Frage bringen?
Bist du sicher mit deiner Aussage: "kopierst die Ziele der Links nach tmp"? Auf meinem System werden die Targets nach tmp kopiert. Das kopieren der Targets war doch in der urspruenglichen Frage (wegen backup) so gewollt (oder habe ich da was verpasst?). /tmp als Ziel habe ich nur geschrieben um zu verhindern dass ein DAU die Zeile mit copy&paste ausprobiert (ohne sich ueber die Folgen klar zu sein;-) Oder einfach ausprobieren, ohne das finale |sh natuerlich. Loesung (fuer die urspruenglichen Frage) hin oder her, der Einzeiler sollte ein "Tool" fuer "Kopieren ... symbolische Links umsetzen" sein. Jetzt alles klar? Achim
On 8 Oct 2002 at 11:17, Achim Hoffmann wrote:
On Thu, 7 Oct 2002, Jan Trippler wrote:
On 6 Oct 2002 at 22:36, Achim Hoffmann wrote: [...]
find /quelle -type l -printf "cp -r %l /tmp/%p\n"|grep '^cp -r /'|sh
Das ist allerdings ein interessanter Vorschlag, aber keine Lösung. Du kopierst die Ziele der Links nach tmp - was soll das für die ursprüngliche Frage bringen?
Bist du sicher mit deiner Aussage: "kopierst die Ziele der Links nach tmp"? Auf meinem System werden die Targets nach tmp kopiert.
Was ist denn Deiner Meinung nach ein *Target*? Oder anders rum gefragt: Nenne mir ein anderes Wort für *Ziel*.
Das kopieren der Targets war doch in der urspruenglichen Frage (wegen backup) so gewollt (oder habe ich da was verpasst?).
Ja, das hast Du offensichtlich. Gesucht war das Umsetzen der Links auf die kopierten Dateien (Ziele bzw. Targets *g* der Links) im Zielverzeichnis. Siehe mein Lösungsvorschlag (ein paar Mails früher).
/tmp als Ziel habe ich nur geschrieben um zu verhindern dass ein DAU die Zeile mit copy&paste ausprobiert (ohne sich ueber die Folgen klar zu sein;-) Oder einfach ausprobieren, ohne das finale |sh natuerlich.
Aha, aber warum schreibst Du sowas nicht einfach dazu? So kommt der gleiche DAU auf die Idee und meldet sich mit *das funktioniert doch gar nicht*.
Loesung (fuer die urspruenglichen Frage) hin oder her, der Einzeiler sollte ein "Tool" fuer "Kopieren ... symbolische Links umsetzen" sein.
Der setzt aber Links nicht um, sondern ersetzt sie durch die physikalische Kopie. _Das_ können alle gebräuchlichen datei-orientierten Kopierbefehle: aus man tar: -h, --dereference don't dump symlinks; dump the files they point to aus man cpio: -L, --dereference Dereference symbolic links (copy the files that they point to instead of copying the links). aus man cp: -L, --dereference always follow symbolic links
Jetzt alles klar?
Hier noch ein netter Einzeiler für das Entfernen von DOS-Zeilenenden: cat dos_file | tr -d '\r' Hat auch nix mit dem Thema zu tun, aber schick, ne? ;-) Jan
On 05-Oct-02 Jan Trippler wrote:
Geschmackssache. cpio treibt sich auf vielen Unixen rum, afio AFAIK nicht ;-)
Nunja, afio ist als Sourcecode zu bekommen und enthält dann nicht mehr als ein paar handliche C-Dateien nebst Makefile. Das kriegt man so ziemlich überall compiliert (kommt ja von der Funktionalität her auch mit dem Funktionsumfang von Posix locker aus). Schön ist außerdem, daß man auch ein statisch gelinktes Binary noch auf ne (Boot-)Diskette kriegt :-). Damit kann eigentlich nix mehr schief gehen. -- Erhard Schwenk http://www.fto.de - http://www.akkordeonjugend.de No Spam replies please.
Hy, Am 02/10/03@16:38 schrieb Poldi Winkler:
Hallo, gibt es einen Befehl, ein Verzeichnis mit Dateien in Unterverzeichnissen und mit symbolischen Links zu diesen Dateien in anderen Unterverzeichnissen zu archivieren/kopieren (mit cp, tar oder wie auch immer)? Also: /verzeichnis /unterverzeichnis 1 File 1 unterverzeichnis 2 symlink von File 1.
Dafür sollte sollte cp -Rd reichen. Aber vielleicht willst Du auch gleich -a --> man cp. -- bye maik
Am Don, 2002-10-03 um 23.13 schrieb Maik Holtkamp:
Hy,
Am 02/10/03@16:38 schrieb Poldi Winkler:
Hallo, gibt es einen Befehl, ein Verzeichnis mit Dateien in Unterverzeichnissen und mit symbolischen Links zu diesen Dateien in anderen Unterverzeichnissen zu archivieren/kopieren (mit cp, tar oder wie auch immer)? Also: /verzeichnis /unterverzeichnis 1 File 1 unterverzeichnis 2 symlink von File 1.
Dafür sollte sollte cp -Rd reichen. Aber vielleicht willst Du auch gleich -a --> man cp.
-- bye maik Funktioniert alles nicht, es kommt:"Operation not permitted" bei allen symlinks. Das Problem scheint doch zu sein, das die symlinks nicht kopiert werden können, da die bisherigen Bezugsdateien ihren Path verändert haben und für die Bildung des neuen links fehlt bei cp offensichtlich eine Funktion. Poldi
Hy, Am 02/10/04@01:04 schrieb Poldi Winkler:
Am Don, 2002-10-03 um 23.13 schrieb Maik Holtkamp:
Hy,
Am 02/10/03@16:38 schrieb Poldi Winkler:
Hallo, gibt es einen Befehl, ein Verzeichnis mit Dateien in Unterverzeichnissen und mit symbolischen Links zu diesen Dateien in anderen Unterverzeichnissen zu archivieren/kopieren (mit cp, tar oder wie auch immer)? Also: /verzeichnis /unterverzeichnis 1 File 1 unterverzeichnis 2 symlink von File 1.
Dafür sollte sollte cp -Rd reichen. Aber vielleicht willst Du auch gleich -a --> man cp. Funktioniert alles nicht, es kommt:"Operation not permitted" bei allen symlinks.
Hm, ich hatte das probiert: ---schnipp--- maik@syl:~ $ mkdir test test/1 test/2 maik@syl:~ $ touch test/1/test maik@syl:~ $ cd test/2 maik@syl:~/test/2 $ ln -s ../1/test . maik@syl:~/test/2 $ cd ~ maik@syl:~ $ cp -a test probe maik@syl:~ $ ls -l probe/2/* lrwxrwxrwx 1 maik maik 9 4. Okt 02:30 probe/2/test -> ../1/test ---schnapp---
Das Problem scheint doch zu sein, das die symlinks nicht kopiert werden können, da die bisherigen Bezugsdateien ihren Path verändert haben und für die Bildung des neuen links fehlt bei cp offensichtlich eine Funktion.
Ja, ich fand auch grad, dass meine Konsturktion ein glücklicher Zufall war :). Wenn es um absolute Pfade geht ist wohl Ebbe. Jedenfalls habe ich es auch nicht hinbekommen, aber es ja schon spät, nacht. -- bye maik
participants (6)
-
Achim Hoffmann
-
David Haller
-
Erhard Schwenk
-
Jan.Trippler@t-online.de
-
Maik Holtkamp
-
poldiwinkler@t-online.de