如何在Linux的终端中循环执行可执行命令?

时间:2012-06-12 22:25:29

标签: linux loops file-io

首先让我描述一下我的情况,我正在Linux平台上工作,并拥有一组.bmp个文件,这些文件会在filename0022.bmpfilename0680.bmp的图片编号中添加一个文件。共有658张图片。我希望能够通过在图片上运行的.exe文件运行这些图片然后将文件踢出到用户指定的文件,它还有一些阈值参数:lower,upper。因此,对可执行文件的典型调用是:

./filter inputfile outputfile lower upper

有没有办法可以通过终端或通过创建某种bash脚本来循环调用所有文件?我的问题与此类似:Execute a command over multiple files with a batch file但这次我在Linux命令行终端工作。

6 个答案:

答案 0 :(得分:15)

您可能有兴趣研究bash脚本。

您可以直接从shell执行for循环中的命令。

生成您特别提到的数字的简单循环。例如,来自shell:

user@machine $ for i in {22..680} ; do
> echo "filename${i}.bmp"
> done

这会为您提供从filename22.bmpfilename680.bmp的列表。这只是处理你提到的范围的迭代。这不包括零填充数。为此,您可以使用printfprintf语法为printf format argument。我们可以使用前一个循环中的$i变量作为参数,并应用%Wd格式,其中W是宽度。前缀W占位符将指定要使用的字符。例如:

user@machine $ for i in {22..680} ; do
> echo "filename$(printf '%04d' $i).bmp"
> done

在上面的$()中充当变量,执行命令以获得与预定义值相对的值。

现在应该为您提供您指定的文件名。我们可以将其应用到实际应用程序中:

user@machine $ for i in {22..680} ; do
> ./filter "filename$(printf '%04d' $i).bmp" lower upper
> done

这可以重写为一行:

user@machine $ for i in {22..680} ; do ./filter "filename$(printf '%04d' $i).bmp" lower upper ; done

从问题中要注意的一点是,.exe文件通常以COFF格式编译,其中linux需要ELF格式的可执行文件。

答案 1 :(得分:8)

你可以试试这样的......

#! /bin/bash
for ((a=022; a <= 658 ; a++))
do
   printf "./filter filename%04d.bmp outputfile lower upper" $a | "sh"
done

答案 2 :(得分:8)

这是一个简单的例子:

for i in {1..100}; do echo "Hello Linux Terminal"; done

附加到文件:(&gt;&gt;用于追加,你也可以使用&gt;来覆盖)

for i in {1..100}; do echo "Hello Linux Terminal" >> file.txt; done

答案 3 :(得分:1)

您可以在shell中测试AS-IS

for i in *; do
    echo "$i" | tr '[:lower:]' '[:upper:]'
done

如果您有特殊路径,请按路径更改* +全局:Ex:

for i in /home/me/*.exe; do ...

请参阅http://mywiki.wooledge.org/glob

答案 4 :(得分:1)

您可以利用xargs进行迭代:

ls | xargs -i ./filter {} {}_out lower upper

注意:

  • {}对应于管道的一行输出,这里是输入文件名。
  • 输出文件将以postfix&#39; _out&#39;。
  • 命名

答案 5 :(得分:0)

这前面加上输出图像的名称,如filtered_filename0055.bmp

for i in *; do
    ./filter $i filtered_$i lower upper
done