![“Find”输出作为 Bash 中“for”的范围以批处理模式执行](https://linux22.com/image/11264/%E2%80%9CFind%E2%80%9D%E8%BE%93%E5%87%BA%E4%BD%9C%E4%B8%BA%20Bash%20%E4%B8%AD%E2%80%9Cfor%E2%80%9D%E7%9A%84%E8%8C%83%E5%9B%B4%E4%BB%A5%E6%89%B9%E5%A4%84%E7%90%86%E6%A8%A1%E5%BC%8F%E6%89%A7%E8%A1%8C.png)
我在 Linux mint 上使用 Bash 命令做了一个循环过程for
,输入范围来自上一个过程来自find
,但它显然是在相对于终端输出的批处理过程中完成的,而不是在范围find
明确的情况下直接进行的并执行以给出终端输出。我的是;
IFS=$'\n'
for s in $(find ~+ -type f -regextype posix-extended -iregex ".*/data\.(tmp|bak)" -printf '%p\n')
{
echo $s
}
它将在 100 秒内静止无任何输出。或更多,而不是直接在终端上显示一些。如何让它像find
单独直接指示的那样快速工作?提前致谢,我很感激。
答案1
一个for
循环迭代一个静止的列表,总是。因此,在完全指定要迭代的项目之前,问题中的循环体不会开始执行。在find
命令执行完成之前,这些不会被完全指定。
您的命令存在几个问题,大多数问题都可以通过问题“解决”为什么循环查找的输出是不好的做法?”。
一般来说,最好充当find
内部脚本的路径名生成器:
find ~+ -type f \( -iname data.tmp -o -iname data.bak \) -exec sh -c '
for pathname do
# process "$pathname" here
done' sh {} +
这样,您无需关心find
提供给循环的路径名如何分隔(这将优雅地处理包含空格和换行符等的路径名)
有关的: