mv
und rsync
sind keine ähnlichen Programme. Insbesondere mv
versucht oft, Objekte einfach umzubenennen. Wenn es sich im selben Dateisystem befindet, kopiert es den Inhalt überhaupt nicht.
Falls Sie imperative_PLs/fortran
noch nicht hatten , dann mv
würde den vorhandenen fortran
nehmen Verzeichnis und benennen Sie es an dieser Stelle im Baum um.
Aber Sie haben bereits ein Verzeichnis (mit Inhalt) an dieser Stelle. Da ein Name nur auf ein einzelnes Objekt verweisen kann, müsste das vorhandene Verzeichnis entweder entfernt oder umbenannt werden. mv
geht davon aus, dass Sie beides nicht wollen und bricht ab.
rsync
kopiert stattdessen die einzelnen Dateien und andere Inhalte in fortran
und fügt sie in den bestehenden imperative_PLs/fortran
ein Verzeichnis.
Betrachten Sie es als rename
stattdessen, und das Verhalten könnte verständlicher erscheinen.
mv
ist eigentlich rename
unter der Decke.
Wenn Sie eine Datei in eine andere Datei verschieben, mv
geht davon aus, dass Sie wissen, was Sie tun, und überschreibt die Zieldatei.
Wenn Sie ein Verzeichnis in ein anderes Verzeichnis verschieben, mv
geht davon aus, dass Sie den Basisnamen Ihres ursprünglichen Verzeichnisses beibehalten und im Zielverzeichnis erstellen möchten. Wenn es auf der Zielseite noch kein Verzeichnis mit diesem Namen gibt oder wenn ein Verzeichnis mit diesem Namen existiert, aber leer ist, ist die Operation erfolgreich.
Wenn das Zielverzeichnis jedoch bereits existiert und nicht leer ist, ist dies kein rename
mehr aber das sollte eine rekursive Datei- und Verzeichnisentfernung sein. rename
ist nicht dafür ausgelegt, also schlägt es fehl, mv
geht nicht weiter, da es davon ausgeht, dass Sie es nicht tun wollten, und schlägt ebenfalls fehl.
-
mv
funktioniert in diesem Fall nicht, weil es nicht dafür ausgelegt ist. Die Systemaufrufe sind (wahrscheinlich) entweder- In dasselbe Dateisystem verschieben:
rename
(ursprünglichlink
undunlink
) - Über Dateisysteme verschieben:rekursive Dateikopie gefolgt von rekursivem
unlink
- In dasselbe Dateisystem verschieben:
-
Meinung:Ich denke, es liegt nicht so sehr daran, dass es nicht entworfen wurde zu funktionieren, da es nicht für diesen Anwendungsfall entwickelt wurde. Für ein "einfaches" Tool, das eine Sache gut machen soll, müssten Sie eine Reihe von Schaltern bereitstellen, um
mv
anzuzeigen Welcher dieser Aktionspfade soll eingeschlagen werden:- Um mit einem Fehler abzubrechen, wie in der aktuellen Implementierung
- Zum Zusammenführen, Abbrechen mit einem Fehler, wenn eine Datei bereits existiert
- Zum Zusammenführen alle bereits vorhandenen Zieldateien ersetzen
Wenn Sie die Zusammenführungs-/Ersetzungsaktion wünschen, können Sie sie ganz einfach mit cp
implementieren gefolgt von rm
, oder indem Sie eines der Dienstprogramme zum Kopieren von Dateibäumen tar
verwenden , pax
usw.