为什么这个“find”命令会扫描所有目录?

为什么这个“find”命令会扫描所有目录?

我只想递归扫描Documents而不离开那个“父”文件夹。我的脚本递归扫描我的整个文件系统,我不确定这个脚本的哪个元素导致了这种情况发生。这是我的:

#/bin/sh
for f in $(find /home/rmintz/Documents/ -type f -name "*jpg")
do
  echo $f
done

我需要进行哪些更改以便该 bash 脚本仅扫描Documents文件夹而不扫描其他内容?

我感觉这是在扫描我的整个文件系统,因为终端中的输出显示了范围之外的目录/home/rmintz/Documents

一个例子是/usr/lib

答案1

你正在使用一种反模式,因为你永远不应该使用循环for来迭代命令的输出find。这有点类似于解析ls输出,你也绝对不应该这么做。

相反,使用find内置的功能来运行命令:

find /home/rmintz/Documents/ -type f -name "*jpg" -exec echo {} \;

这里,{}被替换为找到的每个文件或目录的名称。

如果您想要使用循环(例如,对于更复杂的操作),则必须用 NULL 字符分隔每个文件路径,这是该-print0选项的作用,然后使用whileread解析该输出:

find /home/rmintz/Documents/ -type f -name "*jpg" -print0 | while IFS= read -r -d '' file; do
    echo "$file"
done

如果您不这样做,而是坚持解析 的输出find,那么 的参数for实际上会在每个空格字符上被拆分。这意味着名称中带有空格的文件实际上会显示为 的两个单独文件echo。此外,如果您的文件列表太长,则会超出命令的最大参数大小。这就是管道在第二个示例中发挥作用的地方。

在您的具体示例中,我不知道为什么它会输出类似的路径/usr/lib,因为只有当您的文件名中有一个实际的正斜杠时才会出现这种情况,例如,如果您的文件名为/usr/lib foo.jpg

相关内容