Befehlszeile rekursive / tiefe Verzeichniskopie unter Linux?

13

Was ist eine gute, allgemeine Methode, um unter Linux eine rekursive / tiefe Verzeichniskopie zu erstellen, die in den meisten Fällen funktioniert? Ich habe einfache Dinge wie cp -Rsowie ziemlich ausgefeilte cpioBeschwörungsformeln verwendet. Gibt es signifikante Stärken oder Schwächen, die dazu führen, dass Sie eine der anderen vorziehen? Welches verwenden Sie am häufigsten?

Greg Mattes
quelle

Antworten:

29
NAME
cp - copy files and directories

-a, --archive
   same as -dpR

-d     same as --no-dereference --preserve=links
-p     same as --preserve=mode,ownership,timestamps
-R, -r, --recursive
    copy directories recursively

Also als Antwort auf Ihre Frage:

cp -a /foo /bar

Kopieren Sie alles rekursiv von directory / foo nach directory / bar und behalten Sie dabei die symbolischen Verknüpfungen und die Zeitstempel von file / directory 'mode' 'owner' & 'timestamps' bei.

Gareth
quelle
Dies ist sicherlich eine sehr einfache und elegante Lösung. Haben Sie jemals Nachteile bei diesem Ansatz festgestellt? Verteilte Dateisysteme? Extrem große Exemplare? Haben Sie festgestellt, dass andere Lösungen wie cpio, tar oder rsync in einigen Fällen effizienter sind?
Greg Mattes
1
Es sei denn, es liegt ein physischer Fehler vor. Es ist noch nie ein lokaler CP-Fehler im Speicher aufgetreten (ich habe nur Übertragungen in TB-Größe durchgeführt), und zwar an einen beliebigen Ort, an dem der Server installiert ist (unabhängig von der NFS- oder Samba-Installation). In der rsync-Manpage unter "USAGE" finden Sie Beispiele mit Anleitungen. Mein Favorit: $ rsync --partial --progress --rsh = ssh --archive --verbose --compress foo / user @ hosname: ~ / bar (rsync -avzP)
Gareth
Wie oben erwähnt, ist -a nicht ausschließlich portierbar.
Matthew Flaschen
Nun, ich weiß, dass busybox, GNU & BSD cp in Ordnung sind. Abgesehen von älteren Unix-Boxen habe ich noch nie gesehen, woran das nicht funktioniert? Ich verstehe den Punkt nicht wirklich anders, obwohl ich Zoredaches Gefühl völlig verstehe: "Es scheint immer, als würde die Arbeit korrekt erledigt, also habe ich nie wirklich versucht, einen Ersatz zu finden."
Gareth
@gyaresu Bitte teilen Sie Ihren zweiten Kommentar in eine andere Antwort auf, damit wir darüber abstimmen können.
Greg Mattes
6

Ich benutze am häufigsten einen Befehl wie "cd $ srcdir; tar -c. | Tar -C $ destdir -x" . Ich verwende aber auch rsync -a $ src $ dst.

Die größte Stärke der Teerlösung besteht darin, dass ich sie auf einem System verwenden musste, das vor vielen Jahren kein cpio, rsync oder ein cp hatte, das rekursiv kopiert wurde. Teer ist so ziemlich überall. Es steckt auf meinem Kopf, weil ich es oft benutzt habe, es gibt wahrscheinlich elegantere Wege. Es scheint immer, als würde die Arbeit korrekt erledigt, daher habe ich nie wirklich nach einem Ersatz gesucht.

Zoredache
quelle
Ich mag das Argument "die Allgegenwart von Teer" sehr. Ich beherrsche vi aus ähnlichen Gründen, obwohl ich andere Bearbeitungsumgebungen bevorzuge.
Greg Mattes
-R ist längst Teil des Standards ( opengroup.org/onlinepubs/009695399/utilities/cp.html ), aber nicht -a.
Matthew Flaschen
@ Matthew Flaschen: Ist Ihr Kommentar für @ Gyaresus Antwort bestimmt?
Greg Mattes
Es ist auch für dieses relevant, da Zoredache sagte, dass er auf ein System gestoßen ist, das "kein [...] cp hatte, das rekursiv kopieren würde". Grundsätzlich -R -> portabel, -a -> nicht portabel.
Matthew Flaschen
1
Dies war in ~ 95 und auf dem System lief eine Unix-Version aus den späten 80ern. Ich glaube nicht, dass -R eine Option für cp war, aber ich bin nicht sicher. Ich habe diesen Leckerbissen beim Lesen des Usenets gelernt.
Zoredache
6

Schauen Sie sich ein rsync an ... Ich mag es, weil Sie weniger Daten kopieren, wenn Sie zwei Verzeichnisse auf dem neuesten Stand halten ... es kann auch remote funktionieren. In seiner einfachsten Form ist rsync -a / src / dest

trent
quelle
Das ist ein wirklich guter Punkt. Grundsätzlich hat rsync die Möglichkeit, ein "Directory Diff" zu berechnen und nur das zu übertragen, was zum Synchronisieren der Verzeichnisse benötigt wird. Sie können also wiederholt so etwas wie rsync -a src / dest aufrufen, um Verzeichnisse rekursiv "fortlaufend zu kopieren" (das abschließende / on src wird für eine ordnungsgemäße Synchronisation benötigt), während cp -a src / dest so nicht funktioniert. Der Befehl cp erstellt nach dem ersten cp ein neues src-Verzeichnis in dest. Für nachfolgende Kopien benötigen Sie so etwas wie cp -au src / * dest.
Greg Mattes
Der andere Grund, warum ich rsync mag, ist, dass Sie ihm das Flag -P übergeben können, das einen Fortschrittsbalken anzeigt. Es gibt Ihnen eine Vorstellung davon, wie lange etwas dauern wird
Rory
0

rsyncist ein großartiges Werkzeug. Es ist das Schweizer Taschenmesser für die Datenübertragung. Es ist so ein einfaches und mächtiges Werkzeug. Sobald Sie es verwenden, werden Sie süchtig.

Rory
quelle