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.
-
mvfunktioniert in diesem Fall nicht, weil es nicht dafür ausgelegt ist. Die Systemaufrufe sind (wahrscheinlich) entweder- In dasselbe Dateisystem verschieben:
rename(ursprünglichlinkundunlink) - Ü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
mvanzuzeigen 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.