如何使用 find 指令尋找符號連結和目錄

如何使用 find 指令尋找符號連結和目錄

我討厭 find 指令,只是想把它找出來。到目前為止,我已經使用了多年的 Linux 領域中設計最差的 CLI 工具。

事實證明,以下命令不會回傳任何內容:

cd "$go_proj_path_root" && cd .. && find "$go_proj_path_root" -mindepth 1 -maxdepth 1 -type l -type d

它什麼也不返回,因為顯然 -type l 和 -type d 相互矛盾?如果我只是使用:

cd "$go_proj_path_root" && cd .. && find "$go_proj_path_root" -mindepth 1 -maxdepth 1 -type l 

然後它會在目錄中找到符號連結。有沒有辦法使用相同指令找到目錄和符號連結?真是慘不忍睹,找到了!如果我只想要符號鏈接,那麼我只會使用-type l..wtf。

答案1

是的,-type l -type d意思是「如果檔案是目錄符號連結」。您可能想嘗試的是\( -type l -o -type d \)

另請注意,您的cd不是必需的(除非您使用它來驗證這$go_proj_path_root是您有權訪問的目錄):

find "$go_proj_path_root" -mindepth 1 -maxdepth 1 \( -type l -o -type d \) -print

或者,因為您似乎只對單一目錄中的檔案感興趣:

shopt -s nullglob dotglob
for name in "$go_proj_path_root"/*; do
    if [ -d "$name" ] || [ -L "$name" ]; then
        printf '%s\n' "$name"
    fi
done

帶殼zsh

print -rC1 -- $go_proj_path_root/*(ND/) $go_proj_path_root/*(ND@)

...其中 glob 限定符/@將導致前面的通配模式分別僅匹配目錄或符號鏈接,並且與設置和shell 選項ND具有相同的效果(如果不匹配則展開為空,並且還匹配隱藏名稱)。將在單列中列印結果名稱(避免解釋反斜線序列)。nullglobdotglobbashprint -rC1-r

答案2

當您新增查找條件時,它會預設套用所有條件:所以

find "$go_proj_path_root" -mindepth 1 -maxdepth 1 -type l -type d

要求提供同時是連結和目錄的檔案。

您需要使用“或”:

find "$go_proj_path_root" -mindepth 1 -maxdepth 1 -type l -o -type d

雖然這裡沒有必要,但養成在 周圍使用括號的習慣是個好主意-o

find "$go_proj_path_root" -mindepth 1 -maxdepth 1 \( -type l -o -type d \)

(轉義,因此它們對 shell 沒有任何意義)。

相關內容