我討厭 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
具有相同的效果(如果不匹配則展開為空,並且還匹配隱藏名稱)。將在單列中列印結果名稱(避免解釋反斜線序列)。nullglob
dotglob
bash
print -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 沒有任何意義)。