如何使用 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 没有任何意义)。

相关内容