我只想递归扫描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
选项的作用,然后使用while
和read
解析该输出:
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
。