我習慣於認為mv directory1 directory2/
如果我輸錯了名稱,directory2
它就會失敗並警告我該目錄不存在。事實證明,事實並非如此。
有沒有一種簡單的方法可以實現這一點? (當目標目錄不存在時失敗)。
答案1
mv -t directory2/ directory1
從man 1 mv
:
mv [OPTION]... -t DIRECTORY SOURCE...
-t
,--target-directory=DIRECTORY
將所有SOURCE
參數移入DIRECTORY
但 POSIX 並不需要此選項。您mv
可能支持也可能不支持。
例子:
$ 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
$
答案2
如果您使用的是bash
,且您的mv
命令不支援非 POSIX-t
選項,您仍然可以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
}
有了該函數定義,您就可以說:
mvdir directory1 directory2
在更緊湊的形式中,該函數的核心命令是:
( [ -d directory2 ] && mv directory1 directory2 )
該邏輯在函數中略有擴展,以便在 Directory2 不存在或不是目錄的情況下更清晰地顯示錯誤訊息。如果目標目錄確實存在,mv
則將執行,並且任何錯誤訊息或結果代碼將由 引發mv
。如果該目錄不存在,printf
則將寫入診斷訊息,stderr
並且該函數傳回一個非零結果代碼以指示錯誤。
要進行測試,請從空目錄開始:
$ 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