Files

ls 顯示一個目錄,但無法訪問

  • August 7, 2018

我試圖將一個文件夾從一個位置複製到另一個位置。該文件夾大約為 6.4 Gb。

所以我做了

cp -r source_folder level1/val

之後,我進入 level1 文件夾並檢查:

level1$ ls
val

但如果我嘗試 cd 進入 val,則會引發錯誤:

level1$ cd val
-bash: cd: val: No such file or directory

而且它似乎也沒有複製任何東西:

level1$ du -sh val
0   val

我還用python檢查了目錄是否存在,但它也說它不存在

>>> import os
>>> os.path.exists('level1/val')
False

我什至無法刪除已創建的文件夾:

level1$ rmdir val
rmdir: failed to remove 'val': Not a directory

另一方面,我可以像刪除文件一樣刪除它:

level1$ rm val
level1$ ls
level1$ 

到底是怎麼回事?以及如何確保正確複製文件夾?

編輯 添加了ls -ld source_folder level1/val返回的輸出

lrwxrwxrwx 1 user1 dinfk      4 Jun 20 12:05 source_folder -> test
drwxr-sr-x 2 user2  systems 4096 Aug 27 19:02 level1/val

顯然,val第一次複製的結果是一個斷開的符號連結

  • ls列出val,因為它存在:有一個名為val.
  • cd val抱怨“沒有這樣的文件或目錄”,因為val是一個損壞的符號連結。cd需要訪問連結的目標,但目標不存在(這是損壞的符號連結的定義)。
  • du val顯示 0 因為符號連結不使用任何儲存空間。(名稱和元數據的空間不計算在內。)
  • os.path.exists返回False損壞的符號連結。
  • rmdir val理所當然地抱怨這val不是一個目錄,因為它是一個符號連結。
  • rm val正常刪除val,因為val是一個不是目錄的文件。

您報告:

lrwxrwxrwx 1 user1 dinfk      4 Jun 20 12:05 source_folder -> test

該命令cp -r將符號連結複製為符號連結。因為source_folder是一個目標是 的符號連結test,所以這導致level1/val是一個目標是 的符號連結test。符號連結的目標是一個簡單的字元串,它不會“跟踪”任何東西。不以 a 開頭的符號連結/是相對的。level1/val是一個符號連結,其目標是test它指向level1/test. 由於level1/test不存在,因此符號連結已損壞。

後來你看到:

drwxr-sr-x 2 user2  systems 4096 Aug 27 19:02 level1/val

這次你做了一些不同的事情並複制了一個目錄樹。

要複製連結的目標而不是連結本身,您可以使用

cp -r source_folder/ level1/val

尾部斜杠告訴cp命令對連結指向的目錄而不是符號連結本身進行操作。如果參數是一個目錄,這沒有任何區別。

source_folder- 是引用test目錄的符號連結

但是符號連結中的目錄路徑是相對的。如果您/home/user/test在符號連結中使用絕對路徑(例如 ),複製將正常進行。

如果要從符號連結指向的目錄中複製所有文件,可以使用-doption with cpcommand。

引用自:https://unix.stackexchange.com/questions/388678