Ist der Name bereits in Kleinbuchstaben, wird er dem Befehl mv zweimal übergeben, wie Sie gesehen haben.
Wenn das letzte Argument für mv ein Verzeichnis ist, wird es als Zielverzeichnis behandelt, in das alle anderen benannten Entitäten verschoben werden sollen.
mv test test
prüft zuerst das letzte Argument, ob es existiert und wenn ja, ob es ein Verzeichnis ist. In diesem Fall prüft mv, ob es sich um denselben Einhängepunkt handelt (wenn dies nicht der Fall ist, dh das Ziel ist ein anderes Gerät, muss die Datei kopiert und das Original entfernt werden). In diesem Fall ist es. So baut mv eine Folge von rename(2)
syscalls, Anfügen alle Quellnamen wiederum in das Verzeichnis als Ziel angegeben: mv a b c d/
erzeugen würde rename("a", "d/a")
, rename("b", "d/b")
und rename("c", "d/c")
- so natürlich mv test test
versuchen, zu nennen rename("test", "test/test");
. Was natürlich ein Fehler ist, Sie können ein Verzeichnis nicht in sich selbst verschieben.
Um das Problem zu beheben, muss der mv-Befehl davon abhängig gemacht werden, dass der neue Name anders ist und noch nicht vorhanden ist (wenn Sie zwei verschiedene Dateien mit den Namen "Test" und "test" haben, möchten Sie wahrscheinlich nicht die zweite ersetzen, ohne zu fragen). Wenn ich das nicht getestet und auf einem Telefon new="$(echo "$old" | tr ...)"; [[ $new != $old && ! -e $new ]] && mv "$old" "$new"
getippt habe, würde es ungefähr so aussehen: (Achten Sie auf die Anführungszeichen, Sie möchten keine Leerzeichen in Namen, um Ihnen metaphorische Wedgies zu geben).