我有一个脚本,用于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 循环中使用之前定义的任何内容。对于第二种情况,您的脚本随后将无法访问分组中引入的任何内容。您可以通过在分组中定义一个新变量并稍后尝试访问它来测试它,它将是空的。这可能是在某些情况下更喜欢第一种方法的原因。