如何在运行时循环命令结果

如何在运行时循环命令结果

我有一个脚本,用于find搜索文件并循环结果以进行进一步处理。

for file in $(find ~ -type f -size +1G); do
     filename=$(basename $file)
     echo $file
done

当我find直接运行命令时,它直接输出匹配项。但在这个脚本中,loop首先等待find命令完全完成,然后循环结果。

一旦命令find找到任何匹配项,是否可以让循环运行匹配项?

使用输出是可能的pipe,但我想在循环中做比简单的一行内容更复杂的事情。

答案1

改为学习使用这种方式:

find ~ -type f -size +1G -exec bash -c 'do-stuff-with "$1"' bash_find {} \;

find在的构造中,-exec ... {} \;我们使用 find 命令打开一个内联脚本,bash -c '...'将为它找到的每个文件运行它。

bash_find是我们的内联脚本的名称,它代表$0我们的脚本,如果出现任何错误,脚本将停止,它将用于为我们提供可视化输出,其中打印失败,bash_find后跟错误的简短描述。

答案2

Bash常见问题解答/024这与变量和其他内容的范围有关,具体取决于您将使用的内容。还扩展了跨 shell 的可移植性。以下示例用于bash和 GNU null 分离。

通过进程替换和重定向到 while 循环以及参数的 null 分隔:

count=0

while IFS= read -r -d $'\0' f; do
    printf "%s Processing file: %s\n" "$((++count))" "$f" 
done < <(find -type f -print0)

使用命令分组:

count=0

find -type f -print0 |
    {
        while IFS= read -r -d $'\0' f; do
            printf "%s Processing file: %s\n" "$((++count))" "$f" 
        done
    }

我添加了一个变量count来证明对于这两种情况,范围都很方便,您可以在 while 循环中使用之前定义的任何内容。对于第二种情况,您的脚本随后将无法访问分组中引入的任何内容。您可以通过在分组中定义一个新变量并稍后尝试访问它来测试它,它将是空的。这可能是在某些情况下更喜欢第一种方法的原因。

相关内容