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
重新思考:
這是 and 的問題
find
,ls
還是我的系統的問題?或者它是預期的,根本不是問題?我在 Ubuntu 12.10 上。它在我測試的所有終端上都失敗了,所以似乎不是終端“問題”。
這是答案。但是這個問題指向 bash 作為問題的目標。
解釋是
find
發現"$HOME/MySymlinkedPath"
。它是一個符號連結,而不是一個目錄,所以遞歸下降到此為止。如果表達式匹配"$HOME/MySymlinkedPath"
(例如, infind "$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