mv
funktioniert in diesem Fall nicht, da es nicht dafür ausgelegt ist. Die Systemaufrufe sind (wahrscheinlich) entweder
- Wechseln Sie in dasselbe Dateisystem:
rename
(ursprünglich link
und unlink
)
- Über Dateisysteme wechseln: rekursive Dateikopie gefolgt von rekursiv
unlink
Meinung: Ich denke, es ist nicht so sehr so, dass es nicht funktioniert, 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 anzugeben, zu mv
welchem dieser Aktionspfade Sie gehen sollen:
- Mit einem Fehler zu retten, wie in der aktuellen Implementierung
- Zum Zusammenführen wird ein Fehler gemeldet, wenn bereits eine Datei vorhanden ist
- Ersetzen Sie zum Zusammenführen alle bereits vorhandenen Zieldateien
Wenn die Zusammenführung / ersetzen Aktion ist das, was Sie wollen, können Sie es implementieren leicht genug , um mit cp
gefolgt von rm
oder durch einen der Dateibaum kopieren Dienstprogramme tar
, pax
usw.
rm
Anrufrmdir()
nebenrename()
? (2) "In dasselbe Dateisystem verschieben: Umbenennen (ursprünglich verknüpfen und Verknüpfung aufheben)", was meinen Sie mit "ursprünglich verknüpfen und Verknüpfung aufheben"? (3) Warum beim Verschieben zwischen Dateisystemen "rekursive Dateikopie gefolgt von rekursiver Verknüpfung"?mv
stattrm
.mv
verwendet nurrename()
. Funktioniert zwischen Dateisystemenmv
im Wesentlichen genauso wiecp -r
(aber Vorsicht vor dem Umgang mit speziellen Dateien wie Symlinks, Geräten usw., die traditionell nicht gut verarbeitet werdencp -r
), gefolgt vonrm -r
, also wird siermdir()
in diesem Modus verwendet.mv
undrsync
sind keine ähnlichen Programme. Insbesonderemv
wird häufig versucht, Objekte einfach umzubenennen. Wenn es sich im selben Dateisystem befindet, wird der Inhalt überhaupt nicht kopiert.Wenn Sie dies noch nicht getan haben
imperative_PLs/fortran
,mv
nehmen Sie das vorhandenefortran
Verzeichnis und benennen Sie es an dieser Stelle im Baum um.Sie haben jedoch bereits ein Verzeichnis (mit Inhalten) an diesem Speicherort. 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 dies auch nicht möchten und bricht ab.rsync
Kopiert stattdessen die einzelnen Dateien und anderen Inhaltefortran
und legt sie in dem vorhandenenimperative_PLs/fortran
Verzeichnis ab.Stellen Sie sich das
rename
stattdessen vor, und das Verhalten scheint verständlicher zu sein.quelle
mv
ist eigentlichrename
unter der Decke.Wenn Sie eine Datei in eine andere Datei verschieben, wird
mv
davon ausgegangen, dass Sie wissen, was Sie tun, und die Zieldatei überschreiben.Wenn Sie ein Verzeichnis in ein anderes Verzeichnis verschieben, wird
mv
davon ausgegangen , dass Sie den Basisnamen Ihres ursprünglichen Verzeichnisses beibehalten und im Zielverzeichnis erstellen möchten. Wenn auf der Zielseite noch kein Verzeichnis mit diesem Namen vorhanden ist oder wenn ein Verzeichnis mit diesem Namen vorhanden ist, das jedoch leer ist, ist der Vorgang erfolgreich.Wenn das Zielverzeichnis jedoch bereits vorhanden und nicht leer ist, handelt es sich nicht mehr
rename
um ein rekursives Entfernen von Dateien und Verzeichnissen.rename
ist nicht dafür ausgelegt, also schlägt es fehl,mv
geht nicht weiter, da davon ausgegangen wird, dass Sie es nicht wollten, und schlägt auch fehl.quelle
rm
Anrufrmdir()
nebenrename()
?rm
ruft nie anrename()
. Aber es ruft auf,rmdir()
wenn die-r
Option gegeben wird.mv
stattrm
.mv
Aufrufermdir()
nur, wenn das Quell- und das Zieldateisystem unterschiedlich sind. Ein Grund ist, dass nicht mehr dieselbe Inode einen neuen Pfad hat.Die Fehlermeldung beim Wechseln zwischen Dateisystemen ist etwas ausführlicher:
Es wird also nicht versucht, Verzeichnisse zusammenzuführen, wie Sie es zu erwarten scheinen, sondern das Ziel wird entfernt, bevor die Quelle umbenannt wird. Das Entfernen für Verzeichnisse funktioniert nur, wenn es leer ist.
In Bezug auf Systemaufrufe ist es innerhalb desselben Dateisystems einfach
rename()
Beim Wechsel zwischen Dateisystemen wird zunächst
rename()
dieser Fall erkannt und ein einfacher Versuch unternommenrmdir()
.mv
könnte sich mehr anstrengen, will es aber nicht. ;)quelle
mv
Anrufrmdir()
? Ich habe versucht , ein mitstrace -e trace=file
aufmv
,rmdir()
nicht kommen.rename()
es