2015-04-19 159 views
0

我在Debian下編寫bash腳本時遇到了麻煩。我有一個包含更多文件夾和文件的文件夾(它是一個文件夾樹)。該樹包含符號鏈接。我想通過整體結構遞歸去,檢測破符號鏈接打印他們(不是他們的目標,但鏈接本身)在這FASION(絕對路徑):Bash - 破壞符號鏈接

/tmp/Foo/Bar/symlink1 
/tmp/Foo/symlink2 
/tmp/Foo/Goo/symlink3 

但是我不想和不能使用經典

find -L $(path) -type l 

因爲這遵循了正確的鏈接出給定結構,並檢測結構之外斷開的鏈接,我不希望這些在我的打印輸出,因爲我只想檢測在給定斷符號鏈接在我的結構$(路徑)及其所有子目錄。你能幫我解決嗎?我覺得這需要一些帶有readlink和一些循環的黑魔法,但我不知道如何。謝謝你的建議! :)

+0

我不熟悉'-F'。它有什麼作用? –

+0

find -F $(path)-type l =>遵循符號鏈接(取消引用符號鏈接並替換引用的文件或目錄),當它不能被遵循時,執行類型l並測試文件是否符號鏈接。如果是,它被打印出來。 –

+0

find的哪個變體或版本支持'-F'? –

回答

0

以下命令將做的工作沒有下面的符號鏈接:

find /tmp/ -type l -printf '%p|' -exec stat -L {} \; 2>&1 | grep 'No such' | cut -d'|' -f1 

stat-L選項通過檢查其背後的文件遵循的鏈接(不隨find-L選項混淆不過) 。如果沒有找到的鏈接,你會得到錯誤:

stat: cannot stat `./symlink': No such file or directory 

但是,我們要打印的文件的名稱爲好,所以這就是爲什麼我們使用-printf '%p|'。這裏的管道僅用作分隔符(我懷疑你的文件中有管道名稱),將文件名從stat錯誤中分離出來,否則會打印出來。