Ich hatte die Angewohnheit, zu glauben mv directory1 directory2/
, dass bei einem Tippfehler beim Namen ein directory2
Fehler auftritt und ich gewarnt werde, dass das Verzeichnis nicht existiert. Wie sich herausstellt, ist das nicht der Fall.
Gibt es eine einfache Möglichkeit, dies zu erreichen? (Ein Fehler, wenn das Zielverzeichnis nicht existiert).
Antwort1
mv -t directory2/ directory1
Ausman 1 mv
:
mv [OPTION]... -t DIRECTORY SOURCE...
-t
,--target-directory=DIRECTORY
verschieben Sie alleSOURCE
Argumente inDIRECTORY
Diese Option wird von POSIX jedoch nicht benötigt. Sie mv
kann sie unterstützen, muss es aber nicht.
Beispiel:
$ ls
$ # Nothing here so far
$ mkdir foo bar
$ # Let's move foo to bar/
$ mv -t baz/ foo # Oops, a typo, with -t
mv: failed to access 'baz/': No such file or directory
$ mv foo baz/ # Oops, a typo, without -t
$ ls
bar baz
$
Antwort2
Wenn Sie verwenden bash
und Ihr mv
Befehl die Nicht-POSIX-Option nicht unterstützt , können Sie in Ihrer Datei -t
trotzdem eine Funktion wie folgt definieren:mvdir
.bashrc
mvdir() {
if [ -d "$2" ]
then
mv "$1" "$2"
else
printf 'mvdir: "%s" does not exist, or is not a directory\n' "$2" >&2
return 1
fi
}
Mit dieser Funktionsdefinition können Sie dann sagen:
mvdir directory1 directory2
In einer kompakteren Form lautet der Befehl, der den Kern dieser Funktion bildet:
( [ -d directory2 ] && mv directory1 directory2 )
Diese Logik wird in der Funktion leicht erweitert, um eine übersichtlichere Ausgabe einer Fehlermeldung zu ermöglichen, wenn directory2 nicht existiert oder kein Verzeichnis ist. Wenn das Zielverzeichnis existiert, mv
wird ausgeführt und alle Fehlermeldungen oder Ergebniscodes werden von ausgegeben mv
. Wenn das Verzeichnis nicht existiert, printf
wird eine Diagnose an geschrieben stderr
und die Funktion gibt einen Ergebniscode ungleich Null zurück, um einen Fehler anzuzeigen.
Zum Testen starten Sie in einem leeren Verzeichnis:
$ find *
find: *: No such file or directory
$ mkdir A
$ find *
A
$ mvdir A B || echo fail
mvdir: "B" does not exist, or is not a directory
fail
$ mkdir B
$ find *
A
B
$ mvdir A B || echo fail
$ find *
B
B/A