Beispiel...
Das ist was ich will.
/tmp $ cp -f -R --verbose /tmp/a /tmp/b
`/tmp/a' -> `/tmp/b'
`/tmp/a/file2' -> `/tmp/b/file2'
`/tmp/a/file1' -> `/tmp/b/file1'
Das will ich nicht.
/tmp $ cp -f -R --verbose /tmp/a /tmp/b
`/tmp/a' -> `/tmp/b/a'
`/tmp/a/file2' -> `/tmp/b/a/file2'
`/tmp/a/file1' -> `/tmp/b/a/file1'
Wie kann ich cp so verhalten lassen, als ob der Ordner noch nicht existiert hätte?
(Ich möchte es nicht vorher löschen. Nur einige Dateien aus / tmp / a, um in / tmp / b kopiert zu werden, ohne einen Unterordner a in / tmp / b zu erstellen. Es sieht also aus wie / tmp / b / file1 / tmp / b / file2 und so weiter.)
Antworten:
Rsync wurde für solche Dinge erfunden.
NB: Beachten Sie, dass / source / ein abschließendes "/" hat, das Datei1, Datei2 und nicht den Ordner aufnimmt, in dem es sich befindet. / Destination hat kein abschließendes. Ihre Lösung sieht also so aus:
quelle
-W
wird diersync
Überprüfung auf Unterschiede übersprungen, um die Leistung zu verbessern.Die
-T
Flagge (AKA--no-target-directory
) macht was Sie wollen:quelle
Vorausgesetzt, Bash können Sie tun
Was dies tut ist:
*
) Dateien mit einem Punkt vor ihnen abfangen. Sie werden durch Konvention als "versteckt" betrachtet.*
wird erweitert, bevorcp
der Befehl angezeigt wird. Wenn es also zwei Dateien gibt, wie in Ihrer Frage, wird die erweiterte Befehlszeile angezeigtcp -f -R --verbose /tmp/a/file1 /tmp/a/file1 /tmp/b/
/tmp/b/
.Diese Methode stellt auch sicher, dass Sie die Shell-Option nicht zurücksetzen müssen, da sie in einer Subshell ausgeführt wird. Sie können ähnliche Ergebnisse erzielen, indem Sie sie in eine Skriptdatei einfügen, anstatt sie über die Befehlszeile auszuführen.
quelle
Ich glaube nicht, dass ich das irgendwo beschrieben gesehen habe; Ich habe nur verschiedene Möglichkeiten ausprobiert und eine gefunden, die funktioniert. Soweit ich weiß, ist dies eine natürliche Folge davon, wie
/.
und wiecp
. (Im Gegensatz zu derrsync
in einer anderen Antwort erwähnten Syntax für , die ausdrücklich als Sonderfall dokumentiert ist).quelle