Ich habe zwei gleichnamige Verzeichnisse:
$ ls mydir
file1 file2
$ ls other/mydir
file3 file4
Wenn ich kopieren mydir
zu other
, die beiden mydir
bekommen s verschmolzen:
$ cp -r mydir other
$ ls other/mydir
file1 file2 file3 file4
Wo auf der Man- (oder Info-) Seite für cp
steht, dass dies standardmäßig geschieht?
Das gleiche passiert, wenn ich benutze cp -rn mydir other
.
Ich würde es vorziehen, wenn cp
ich gefragt würde, ob ich die beiden zusammenführen möchte mydir
. so dass , wenn ich kopieren mydir
zu und other
dabei vergessen , dass es bereits eine andere mydir
in other
, konnte ich den Vorgang abbrechen. Ist das möglich?
cp
Befehl ausführen.if [ ! -d other/mydir] ; then; cp -r mydir other; else; echo "Directory already exists at destination"; fi
cp
, es sei denn, Sie überprüfen zuerst, also stellen Sie sicher, dass Sie zuerst überprüfen."ls
, dieses Skript manuell zu überprüfen, als es jedes Mal zu bearbeiten.Antworten:
Ich sehe dies nicht im Handbuch von GNU Coreutils dokumentiert. Es wird von POSIX angegeben :
cp -rn
hilft nicht, weil die-n
Option nur "Nicht überschreiben" sagt, aber das Zusammenführen von Verzeichnissen nichts überschreibt.Ich sehe keine Option dafür
rsync
oderpax
das würde dir helfen.Sie können dieses Verhalten mit einem Wrapper erhalten
cp
. Das Parsen der Befehlszeilenoptionen ist jedoch umständlich. Ungetesteter Code. Bekanntes Problem: Dies unterstützt keine abgekürzten langen Optionen.quelle
shift args
?Sie können ein Wrapper-Skript zum Kopieren von Verzeichnissen (cpDirs) erstellen, das prüft, ob Zusammenführungen auftreten:
quelle
find
Das Grundelement von '-ok
funktioniert so,-exec
außer dass es zuerst mit einer Beschreibung des Befehls, den es ausführen soll, zu seinem stderr auffordert und auf eine positive oder negative Antwort (wiey
odern
) wartet, gefolgt von einer Eingabe. Das obigefind
Skript fordert vor dem Kopieren zur Bestätigung auf, ob auch ein Verzeichnis in/src/path
vorhanden/tgt/path
ist, aber alle gefundenen Dateien in/src/path
werden ohne Aufforderung kopiert.(Sie müssen das
echo
s entfernen , damit es mehr als nur so tut, als würde es funktionieren.)Ein anderes
find
Skript, das eine Shell für Verzeichnisse der ersten Ebene aufruft,/src/path
sieht möglicherweise folgendermaßen aus:quelle