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

use*_*140 -1 script bash bash-scripting

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

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

我需要改变什么才能让这个 bash 脚本只扫描Documents文件夹而不扫描其他任何东西?

我给人的印象是,这是扫描我的整个文件系统,因为终端中的输出显示/home/rmintz/Documents.

一个例子是/usr/lib

slh*_*hck 5

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

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

find /home/rmintz/Documents/ -type f -name "*jpg" -exec echo {} \;
Run Code Online (Sandbox Code Playgroud)

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

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

find /home/rmintz/Documents/ -type f -name "*jpg" -print0 | while IFS= read -r -d '' file; do
    echo "$file"
done
Run Code Online (Sandbox Code Playgroud)

如果您不这样做,而是坚持解析 的输出findfor则实际上将在每个空白字符上拆分的参数。这意味着名称中带有空格的文件实际上会显示为两个单独的echo. 此外,如果您的文件列表太长,您将超过命令的最大参数大小。这是管道在第二个示例中的帮助之处。

在您的具体的例子,我不知道为什么它会像输出的路径/usr/lib,因为这只能是如果你有在文件名,如实际斜线如果你的文件被调用的情况/usr/lib foo.jpg