首先让我描述一下我的情况,我正在Linux平台上工作,并拥有一组.bmp
个文件,这些文件会在filename0022.bmp
到filename0680.bmp
的图片编号中添加一个文件。共有658张图片。我希望能够通过在图片上运行的.exe文件运行这些图片然后将文件踢出到用户指定的文件,它还有一些阈值参数:lower,upper。因此,对可执行文件的典型调用是:
./filter inputfile outputfile lower upper
有没有办法可以通过终端或通过创建某种bash脚本来循环调用所有文件?我的问题与此类似:Execute a command over multiple files with a batch file但这次我在Linux命令行终端工作。
答案 0 :(得分:15)
您可能有兴趣研究bash脚本。
您可以直接从shell执行for循环中的命令。
生成您特别提到的数字的简单循环。例如,来自shell:
user@machine $ for i in {22..680} ; do
> echo "filename${i}.bmp"
> done
这会为您提供从filename22.bmp
到filename680.bmp
的列表。这只是处理你提到的范围的迭代。这不包括零填充数。为此,您可以使用printf
。 printf
语法为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 ...
答案 4 :(得分:1)
您可以利用xargs
进行迭代:
ls | xargs -i ./filter {} {}_out lower upper
注意:
答案 5 :(得分:0)
这前面加上输出图像的名称,如filtered_filename0055.bmp
for i in *; do
./filter $i filtered_$i lower upper
done