我讨厌 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 没有任何意义)。