將目錄移到另一個目錄時,是否有一種簡單的方法可以在目標目錄不存在時產生失敗?

將目錄移到另一個目錄時,是否有一種簡單的方法可以在目標目錄不存在時產生失敗?

我習慣於認為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

相關內容