find 在符號連結路徑上不起作用?

find 在符號連結路徑上不起作用?

如果我執行此命令,find $HOME/MySymlinkedPath -name "run*.sh"則不會發生任何情況,也不會出現任何錯誤(「MySymlinkedPath」是指向 $HOME 之外的另一個硬碟的符號連結路徑)。

這些也失敗了:

find ~/MySymlinkedPath -name "run*.sh"
find /home/MyUserName/MySymlinkedPath -name "run*.sh"

只是為了確保這一點,這個不存在的路徑會失敗(當然),find $HOME/MySymlinkedPathDUMMYTEST -name "run*.sh"因此正在找到該路徑(因為該錯誤不會發生),但find不會對其執行搜索,而我現在一無所知。

cd $HOME/MySymlinkedPath只有當我首先像這樣刪除路徑引用時它才有效,find -name "run*.sh"但這對我的腳本不利。

附加資訊
這個命令照常工作ls $HOME/MySymlinkedPath/run*.sh,如果我去那裡cd $HOME/MySymlinkedPath運行它ls ..,結果不是我所期望的——符號鏈接路徑所在的路徑列表——它返回另一個媒體上的真實路徑列表/硬碟!

pwd -P
/media/MediaIdentifier/RealPath
pwd
/home/MyUser/MySymlinkedPath

重新思考
這是 和 的問題findls還是我的系統的問題?或者這是預期的並且根本不是問題?我使用的是 Ubuntu 12.10。它在我測試的所有終端上都失敗了,所以似乎不是終端“問題”。

答案1

這裡就是答案。但這個問題指出 bash 是問題的目標。

解釋是find發現"$HOME/MySymlinkedPath".它是一個符號鏈接,而不是目錄,因此遞歸下降到此為止。如果表達式匹配"$HOME/MySymlinkedPath"(例如, in find "$HOME/MySymlinkedPath" -name 'My*'),find則將其列印為匹配項。

正如那裡所指出的,我發現處理它並修復所有腳本的最簡單/最乾淨的方法是:

find "$HOME/MySymlinkedPath" -name "run*.sh"

只要加上一個斜杠,這樣find就不是從符號連結開始,而是從符號連結的目標開始:

find "$HOME/MySymlinkedPath/" -name "run*.sh"

或者,將-H選項傳遞給find(請注意,它必須先出現在路徑之前)以告訴它遍歷在其命令列上傳遞的符號連結。 (這與-L告訴find遍歷遞歸下降期間遇到的符號連結不同。)

find -H "$HOME/MySymlinkedPath" -name "run*.sh"

最後,它在這裡效果最好-L(因為我透過資料夾符號連結了幾個檔案系統)。但它會產生大量無問題的錯誤訊息,所以我添加了2>/dev/null;並決定創建這個別名alias find='find -L'

find -L "$HOME/MySymlinkedPath" -name "run*.sh" 2>/dev/null

相關內容