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