以下命令有什麼不同?
mv foo bar
mv foo/ bar/
mv foo/ bar
mv foo bar/
還是沒有差別?或者這取決於所使用的命令?例如,我讀到 rsync 行為會根據您使用的版本而有所變化。有沒有人有一個很好的解釋,這樣我就不必再猜測並且感覺我知道自己在做什麼?
答案1
許多 Unix 實用程式會根據是否有尾部斜線來不同地處理符號連結。
此行為在POSIX 符號連結文檔並且在GNU coreutils 文檔。
基本上,尾部斜杠意味著跟隨(或“取消引用”)符號鏈接。
例如,在下面的程式碼中,dirlink
表示符號鏈接,但dirlink/
表示符號連結指向的目錄。 rm
除非您說 ,否則不會刪除目錄rm -r
,但rm
如果沒有選項,則會愉快地刪除符號連結。
$ mkdir dir
$ ln -s dir dirlink
$ ls -l
total 4
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:26 dir
lrwxrwxrwx 1 mikel mikel 3 2011-02-02 22:26 dirlink -> dir
$ ls -l
total 4
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:26 dir
lrwxrwxrwx 1 mikel mikel 3 2011-02-02 22:26 dirlink -> dir
$ rm dirlink/
rm: cannot remove `dirlink/': Is a directory
$ rm dirlink
$ ls -l
total 4
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:26 dir
它對於查看目錄的權限也很有用,而不必擔心該目錄是真實目錄還是只是目錄的符號連結。
$ ls -ld dirlink
lrwxrwxrwx 1 mikel mikel 3 2011-02-02 22:46 dirlink -> dir
$ ls -ld dirlink/
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:46 dirlink/
它仍然適用於常規目錄:
$ ls -ld dir
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:46 dir
$ ls -ld dir/
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:46 dir/
另一個例子是find
命令。如果path
您要求它搜索的是符號鏈接,則預設情況下它不會遵循符號鏈接,這意味著它只處理符號鏈接。添加尾部斜杠使其將符號鏈接視為鏈接指向的目錄。
$ find dir
dir
dir/file
$ find dirlink
dirlink
$ find dirlink/
dirlink/
dirlink/file
(某些版本的 find 有一個-follow
or-L
選項,但這使得它遵循所有符號鏈接,而不僅僅是第一個)
在 的情況下rsync
,是否應該附加斜線取決於您是否希望要複製的目錄成為子目錄。
$ mkdir dir
$ touch dir/file
$ rsync -r dir dir.bak
$ find .
.
./dir
./dir/file
./dir.bak
./dir.bak/dir
./dir.bak/dir/file
$ rm -r dir.bak
$ rsync -r dir/ dir.bak
$ find .
.
./dir
./dir/file
./dir.bak
./dir.bak/file
換句話說:
rsync dir dir.bak
複製dir
到dir.bak
,dir
裡面製作dir.bak
rsync dir/ dir.bak
複製 的所有內容dir
,而不dir
在裡面製作dir.bak
答案2
foo
正如 jsalonen 已經說過的,如果和bar
實際上是目錄,這些命令確實具有相同的結果。
但是,如果foo
和bar
不是目錄,那麼如果您附加尾部斜杠,該命令將失敗;如果不附加,則命令將成功。問題是,如果命令成功,它可能不會得到您想要的結果。事實上,如果foo
和bar
是文件(bar
將被覆蓋),您甚至可能會丟失資料。
如果您的目的是指定目錄而不是文件,那麼您應該使用尾部斜杠,因為它使命令更加健壯:如果預期foo
或是bar
目錄失敗,那麼命令將正常失敗,而不是產生意外結果。
此外,一些(罕見)命令的行為會根據尾隨斜杠的存在而有所不同,即使對於目錄也是如此(一個例子是rsync
)。