Wenn ich mv
einen Ordner namens "folder" in ein Verzeichnis verschiebe, das bereits "folder" enthält, werden sie dann zusammengeführt oder ersetzt?
mv
Verzeichnisse können nicht zusammengeführt oder überschrieben werden. Die Meldung "mv: kann 'a' nicht nach 'b' verschieben: Verzeichnis nicht leer" wird angezeigt , auch wenn Sie diese --force
Option verwenden.
Sie können dies mit anderen Tools umgehen (z. B. rsync
, find
oder sogar cp
), aber Sie müssen die Auswirkungen sorgfältig abwägen:
rsync
kann den Inhalt eines Verzeichnisses in ein anderes zusammenführen (idealerweise mit der Option --remove-source-files
1 , um nur die Quelldateien sicher zu löschen, die erfolgreich übertragen wurden, und mit der üblichen Berechtigungs- / Besitz- / Zeitbewahrungsoption, -a
wenn Sie dies wünschen) rsync
‚s --link-dest=DIR
Option (Hardlinks anstelle des Kopierens Dateiinhalte zu erstellen, wo möglich) und --remove-source-files
eine semantische sehr ähnlich zu einem regulären zu bekommen mv
. --link-dest
muss ein absoluter Pfad zum Quellverzeichnis (oder ein relativer Pfad vom Ziel zur Quelle ) angegeben werden. --link-dest
auf unbeabsichtigte Weise verwendet (was möglicherweise zu Komplikationen führt oder nicht), erfordert die Kenntnis (oder Bestimmung) des absoluten Pfads zur Quelle (als Argument für --link-dest
) und lässt erneut eine leere Verzeichnisstruktur übrig, die bereinigt werden muss per 1 .find
die Quellverzeichnisstruktur auf das Ziel , um sequentiell neu erstellen, dann einzeln die tatsächlichen Dateien bewegen cp
kann feste Verknüpfungen erstellen (einfach zusätzliche Zeiger auf dieselbe vorhandene Datei setzen), was zu einem Ergebnis führt, das einem Zusammenführen sehr ähnlich ist mv
(und sehr effizient ist, da nur Zeiger erstellt werden und keine tatsächlichen Daten kopiert werden müssen) Welche dieser Problemumgehungen (falls zutreffend) geeignet ist, hängt stark von Ihrem speziellen Anwendungsfall ab.
Denken Sie wie immer nach, bevor Sie einen dieser Befehle ausführen, und erstellen Sie Sicherungskopien.
1: Beachten Sie, dass rsync --remove-source-files
keine Verzeichnisse gelöscht werden. Sie müssen also etwas tun find -depth -type d -empty -delete
, um den leeren Quellverzeichnisbaum zu entfernen.
mv
. Diese Antwort wäre besser mit einer breiteren Wahrheit. Linux, BSD und "echtes" Unix oder eine Referenz von POSIX oder SUS.mv
von Debian verwendete Implementierung ausprobiert - der Schwerpunkt liegt auf ausprobiert , da in der Manpage dieses Verhalten nicht erwähnt wird ...--delete
nur Dateien im Zielverzeichnis gelöscht werden , die im Quellverzeichnis nicht vorhanden sind.-H
Funktion beibehalten oder Dateien im Ziel mithilfe von fest verknüpfen--link-dest
. Lesen Sie jedoch die Manpage, bevor Sie sie verwenden.quelle
--remove-source-files
hat den Vorteil, dass nur Dateien entfernt werden, die erfolgreich übertragen wurden. Sie können alsofind
leere Verzeichnisse entfernen, und alles, was nicht übertragen wurde, bleibt erhalten, ohne dass diersync
Ausgabe überprüft werden muss.Sie können die
-l
Option des Befehls cp verwenden , mit der anstelle von vollständigen Datenkopien feste Verknüpfungen von Dateien auf demselben Dateisystem erstellt werden. Der folgende Befehl kopiert den Ordnersource/folder
in einen übergeordneten Ordner (destination
), der bereits ein Verzeichnis mit dem Namen enthältfolder
.Sie können auch die verwenden
-P
(--no-dereference
- oder symbolische Links nicht de-reference)-a
(--archive
- erhalten alle Metadaten enthält auch-P
Option), je nach Ihren Bedürfnissen.quelle
cp
nicht,rsync
weil jedes System es hatcp
und jeder damit vertraut ist.cp
mit der Betriebszeit vonmv
.-n
mv /fs1/file /fs2/
(zwischen Dateisystemen) führt eine Kopie und dann eine Löschung durch.mv
funktioniert (vorausgesetzt, das Zielverzeichnis existiert noch nicht), auch wenn es nicht "effizient" ist oder wie auch immer Sie es nennen,cp -rl
wird es fehlschlagen.Ich würde diese vier Schritte empfehlen:
oder noch besser, hier ist ein Skript, das eine Semantik ähnlich der
mv
folgenden implementiert :quelle
rsync -u
(nur aktualisieren, wenn neuere) tun möchten, können Sie (mv
zumindest in einigen Versionen) auch die-u
Option verwenden. In diesem Fall möchten Sie jedoch möglicherweise nicht leere und leere Quellverzeichnisse löschen, um die Fälle abzudecken, in denen die Dateien im Quellbaum nicht neuer sind. @schuess: Es sieht so aus, als ob es mehrere SOURCE-Argumente geben kann, wenn Sie das brauchen.Auf diese Weise werden die Verzeichnisse zusammengeführt. Es ist viel schneller als rsync, da es nur die Dateien umbenennt, anstatt sie zu kopieren und dann zu löschen.
quelle
dest
bereits ein Verzeichnis mit demselben Namen wie in istsource
. Und die Dateien werden in einen Ordner verschobendest
, der sich in befindetsource
. Der Befehl tut nichts anderes alsmv source/* source/dest/.
Eine Möglichkeit, dies zu erreichen, wäre:
Solange in
folder
und keine zwei Dateien denselben Namen habendirectory/folder
, erzielen Sie dasselbe Ergebnis, dh das Zusammenführen.quelle
rm folder
?rm folder -fR
funktioniert immer bei mirFür die reinsten Kopien verwende ich die Blockread-Kopiermethode tar (-) B.
Beispiel aus dem Quellpfad ('cd' dort, falls erforderlich):
Dadurch wird eine exakte Kopie des Quellbaums erstellt, wobei der Eigentümer und die Berechtigungen erhalten bleiben. Wenn der Zielordner vorhanden ist, werden die Daten zusammengeführt. Es werden nur Dateien überschrieben, die bereits vorhanden sind.
Beispiel:
Wenn der Kopiervorgang erfolgreich ist, können Sie die Quelle (
rm -rf <source>
) entfernen . Dies ist natürlich keine exakte Verschiebung: Die Daten werden kopiert, bis Sie die Quelle entfernen.Als Option können Sie ausführlich sein (Anzeige der zu kopierenden Datei auf dem Bildschirm), mit -v:
tar cBvf -
c
: erstellenB
: ganzen Block lesen (für Pipe lesen)v
: ausführlichf
: Zu schreibende Dateix
: Extrakt-
: stdout / stdinsourcefolder
kann auch sein*
(für alles im aktuellen Ordner)quelle
f -
von tar ist normalerweise nicht erforderlich - standardmäßig wird von stdin / write nach stdout gelesen.Hier ist ein Skript, das für mich funktioniert hat. Ich bevorzuge mv gegenüber rsync, daher verwende ich Jewel und Jonathan Mayers Lösungen.
quelle
Es ist keine gute Idee, Befehle wie cp oder rsync zu verwenden. Bei großen Dateien dauert es sehr lange. MV ist viel schneller, da es nur die Inodes aktualisiert, ohne die Dateien physisch zu kopieren. Eine bessere Option ist die Verwendung des Dateimanagers Ihres Betriebssystems. Für Opensuse gibt es einen Dateimanager namens Konquerer. Es kann Dateien verschieben, ohne sie tatsächlich zu kopieren. Es hat "Ausschneiden und Einfügen" -Funktion wie in Windows. Wählen Sie einfach alle Unterverzeichnisse in Verzeichnis A aus. Klicken Sie mit der rechten Maustaste und "verschieben" Sie das Verzeichnis B, das möglicherweise Unterverzeichnisse mit demselben Namen enthält. Es wird sie zusammenführen. Es gibt auch Optionen, ob Sie Dateien mit demselben Namen überschreiben oder umbenennen möchten.
quelle
mv
verwendet wird.Python-Lösung
Da ich keine zufriedenstellende vorbestehende Lösung finden konnte, habe ich beschlossen, ein schnelles Python-Skript zu erstellen, um dies zu erreichen.
Diese Methode ist insbesondere deshalb effizient, weil der Quelldateibaum nur einmal von unten nach oben durchsucht wird.
Es wird Ihnen auch ermöglichen, Dinge wie das Überschreiben von Dateien schnell nach Ihren Wünschen zu optimieren.
Verwendungszweck:
verschiebt den gesamten Inhalt von
src/*
indest/
undsrc/
verschwindet.Move-Merge-Verzeichnisse
GitHub Upstream .
Siehe auch: https://stackoverflow.com/questions/22588225/how-do-you-merge-two-directories-or-move-with-replace-from-the-windows-command
quelle
Dies ist der Befehl zum Verschieben von Dateien und Ordnern an ein anderes Ziel:
Denken Sie daran :
mv
Befehl funktioniert nicht, wenn der Ordner zusammengeführt werden (dh eine anderen Ordner mit dem gleichen Namen im Ziel existiert bereits) und das Ziel ist nicht leer .Wenn der Zielordner leer ist, funktioniert der obige Befehl einwandfrei.
Also, um beide Ordner in jedem Fall zusammenzuführen,
entweder in 2 Befehlen:
Oder kombinieren Sie beide als einmaligen Befehl:
quelle