Wie kann ich entscheiden, dass mv in ein Verzeichnis verschoben wird, anstatt dieses zu ersetzen?

18

Angenommen, ich habe ein Verzeichnis /hello.

Dann mache ich mv /hello /hello2.

Bin ich bewegend /helloin /hello2/hello? Oder ziehe ich /helloum /hello2?

Wenn ich so etwas mache, bekomme ich anscheinend inkonsistente Ergebnisse.

user4951
quelle
1
In welchem ​​Fall ist das Ergebnis inkonsistent? Es sieht so aus, als würde das Zielverzeichnis, sobald es existiert, in das Zielverzeichnis verschoben, andernfalls wird es umbenannt.
Jmathew
Das ist widersprüchlich. Der gleiche Befehl sollte dasselbe tun. Das heißt, der Befehl ist nicht eindeutig.
user4951
Das ist nicht wirklich inkonsistent, weil es im Kontext konsistent agiert. Ich kann zwar sehen, wie verwirrend es ist, aber je mehr ich darüber nachdenke, desto besser muss der Befehl sein, um in allen Szenarien zu funktionieren.
Jmathew
Ich würde eher sagen , das ist , wie es konzipiert ist und es ist auch logical..if Sie verwenden mvmit Dateien , die es nicht die gleiche thing.just renaming.but mit mvmit Verzeichnissen ist es nicht gut das gesamte Verzeichnis mit Unterverzeichnis zu löschen , weil einen mvBefehl, der nicht ist sicher. so wird es verschoben als test1/test2. aber wenn du es trotzdem erreichen willst, schreibe ein, aliaswelches prüfe, ob der angegebene Parameter directory ist und benutze dann rm -rf das Verzeichnis und benutze den mvBefehl, aber benutze es auf dein eigenes Risiko.
harish.venkat
Ich vermute, Ihr Beispiel basiert auf der falschen Erinnerung an etwas, das in der Vergangenheit passiert ist, basierend auf "Es scheint, dass ich so etwas tue". Wenn beides /hellound /hello2Verzeichnisse sind, ist mir aufgefallen, dass dieses Verzeichnis cp /hello /hello2inkonsistent ist. Je nachdem , welche Kombination von Hinterschrägstriche gibt es manchmal der Inhalt /hellokopiert werden in /hello2, und manchmal das Verzeichnis selbst wird kopiert in.
Izkata

Antworten:

16

mv a bVersuche , sich zu bewegen ain , bwenn bein Verzeichnis oder ein symbolischer Link auf ein Verzeichnis ist. Ansonsten wird es (oder kopieren und löschen , wenn auf verschiedenen Dateisystemen) umbenennen azu b.

Um ein konsistentes Ergebnis zum Verschieben einer Datei in ein Verzeichnis zu erhalten, können Sie Folgendes tun:

mv file dir/

oder

mv file dir/.

Wenn dirnicht vorhanden ist , erhalten Sie eine Fehlermeldung erhalten, und es wird nicht umbenannt filezu dir.

Wenn Sie dagegen a ausführen möchten, renameohne sich Sorgen machen zu müssen, ob die Zieldatei als Verzeichnis existiert oder nicht, können Sie mit GNU mv Folgendes ausführen:

mv -T file dest

In diesem Fall filewird nicht verschoben, destwenn destes sich um ein Verzeichnis handelt. Wenn jedoch beide fileund destVerzeichnisse sind und destleer sind, filewird in umbenannt dest(und das Original wird destentfernt). Wenn beide Verzeichnisse sind und destnicht leer sind, mv -Twerde ich mich beschweren.

Gleiche, wenn fileund destsind nicht Verzeichnisse (und das schließt Symlinks einschließlich symbolische Links zu Verzeichnissen), filewird umbenannt werden dest(obwohl Sie eine Aufforderung erhalten, wenn Sie keine Schreibberechtigung haben dest), und das Original destentfernt wird. Es gibt einen Unterschied zu mv file destdem Fall, in dem destein Symlink zu einem Verzeichnis vorhanden ist. Mit -T, fileumbenannt wird dest, aber ohne -T, filein das durch wies Verzeichnis verschoben dest.

Zusammenfassend kann gesagt werden, dass nach dem Umbenennen mv -T file destentweder eine Fehlermeldung (oder eine Eingabeaufforderung) angezeigt wird. Wenn der Befehl erfolgreich ausgeführt wurde, wurde das Original , sofern es zuvor vorhanden war, entfernt.filedestdest

Stéphane Chazelas
quelle
14

Dies hängt ganz davon ab, ob es bereits ein Verzeichnis mit dem Namen '/ hello2' gibt oder nicht.

Wenn / hello2 existiert UND ein Verzeichnis ist, verschiebt move / hello immer nach / hello / hello2

Wenn / hello2 nicht existiert, wird move / hello immer in / hello2 umbenennen

Wenn / hello2 existiert UND eine Datei ist, erhalten Sie die Fehlermeldung "Nicht-Verzeichnis 'hello2' kann nicht mit Verzeichnis 'hello' überschrieben werden.

Don Simon
quelle
3

Ich habe es versucht

mkdir test1
mv -v test1 test2
output:`test1' -> `test2'
mkdir test1
mv -v test2 test1
output: `test2' -> `test1/test2'
touch test2
output:mv: cannot overwrite non-directory `test2' with directory `test1'

hoffe das erklärt alles. -vist ausführlicher Modus.

harish.venkat
quelle