如果目录中有 5 或 6 个文件(特定文件 .biz),并且您希望一次将它们存储在变量 $file 中,并应用一组命令,直到在目录中找不到更多 .biz 文件,该怎么办。
我尝试使用
for f in graham/quant
do
if grep "max" $file;
then
maximum.sh $file
elif grep "milan" $file;
then
milan.sh $file
elif grep "min" $file;
then
minimum.sh $file
.
.
.
else
echo " keep working you are close "
fi
done
但程序执行第一个有效条件的所有文件。
如果您有 5 个扩展名为 .biz 的文件,则所有这些文件都将以第一个有效条件执行 5 次。
输出将是:
Milan
Milan
Milan
Milan
Milan
代替
Milan
Minimum
Maximum
.
.
有任何想法吗?
答案1
grep -lZ max graham/quant/*.biz | xargs -0r maximum.sh
grep -lZ milan graham/quant/*.biz | xargs -0r milan.sh
grep -lZ min graham/quant/*.biz | xargs -0r minimum.sh
注意:需要 GNUgrep
才能-Z
选择输出 NUL 分隔的文件名。
这些行使用 的grep
选项-l
输出包含所需模式(max
、milan
或min
)的文件列表,以及-Z
使用 NUL 分隔文件名的选项(以便可以安全地使用带有任何有效字符)。
这是通过管道输入的,xargs
以便为每个匹配的文件运行适当的脚本。
假设这些脚本可以正确处理命令行上的多个文件名参数。如果没有,请添加-n 1
到xargs
选项中。
例如grep -lZ max graham/quant/*.biz | xargs -0r -n 1 maximum.sh
从man grep
:
-l
,--files-with-matches
抑制正常输出;相反,打印通常会打印输出的每个输入文件的名称。扫描将在第一个匹配处停止。
和:
-Z
,--null
输出零字节(ASCII NUL 字符),而不是通常跟在文件名后面的字符。例如,
grep -lZ
在每个文件名后输出一个零字节,而不是通常的换行符。即使文件名包含换行符等不常见字符,此选项也会使输出明确无误。
find -print0
此选项可与、perl -0
、sort -z
、 和 等命令一起使用xargs -0
来处理任意文件名,甚至包含换行符的文件名。
答案2
正如用户所说,它正在使用一个古老的 Unix shell,让我们尝试另一个版本的脚本:
#!/bin/sh
#test version for ancient shell.
cd graham/quant
for file in *.biz
do
grep -q "max" "$file"
if [ "$?" = "0" ]; then
maximum.sh "$file"
fi
grep -q "milan" "$file"
if [ "$?" = "0" ]; then
milan.sh "$file"
fi
grep -q "min" "$file"
if [ "$?" = "0" ]; then
minimum.sh "$file"
fi
done
cd $OLDPWD