Unix:目錄名後是否有斜槓

Unix:目錄名後是否有斜槓

以下命令有什麼不同?

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 有一個-followor-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複製dirdir.bak,dir裡面製作dir.bak
  • rsync dir/ dir.bak複製 的所有內容dir,而不dir在裡面製作dir.bak

答案2

foo正如 jsalonen 已經說過的,如果和bar實際上是目錄,這些命令確實具有相同的結果。

但是,如果foobar不是目錄,那麼如果您附加尾部斜杠,該命令將失敗;如果不附加,則命令將成功。問題是,如果命令成功,它可能不會得到您想要的結果。事實上,如果foobar是文件(bar將被覆蓋),您甚至可能會丟失資料。

如果您的目的是指定目錄而不是文件,那麼您應該使用尾部斜杠,因為它使命令更加健壯:如果預期foo或是bar目錄失敗,那麼命令將正常失敗,而不是產生意外結果。

此外,一些(罕見)命令的行為會根據尾隨斜杠的存在而有所不同,即使對於目錄也是如此(一個例子是rsync)。

相關內容