Find

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

  • September 24, 2016

如果我執行此命令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 的問題findls還是我的系統的問題?或者它是預期的,根本不是問題?我在 Ubuntu 12.10 上。它在我測試的所有終端上都失敗了,所以似乎不是終端“問題”。

是答案。但是這個問題指向 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

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