17

让我先描述一下我的情况,我在一个 Linux 平台上工作,并且有一组.bmp文件,这些文件从filename0022.bmp最多filename0680.bmp. 所以一共有658张图片。我希望能够通过对图片进行操作的 .exe 文件运行这些图片中的每一个,然后将文件踢出到用户指定的文件中,它还有一些阈值参数:lower、upper。所以可执行文件的典型调用是:

./filter inputfile outputfile lower upper

有没有一种方法可以让我仅从终端或通过创建某种 bash 脚本来循环调用所有文件?我的问题与此类似:使用批处理文件对多个文件执行命令,但这次我在 Linux 命令行终端中工作。

4

6 回答 6

15

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

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

一个简单的循环来生成您特别提到的数字。例如,从外壳:

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

这将为您提供从filename22.bmp到的列表filename680.bmp。这只是处理您提到的范围的迭代。这不包括零填充数字。为此,您可以使用printf. printf语法printf format argument是. 我们可以使用$i上一个循环中的变量作为参数,并应用%WdW 是宽度的格式。前缀 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 文件通常以COFFlinux 期望ELF格式可执行文件的格式编译。

于 2012-06-13T15:28:29.273 回答
11

这是一个简单的例子:

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

追加到文件:(>>用于追加,也可以使用>覆盖)

for i in {1..100}; do echo "Hello Linux Terminal" >> file.txt; done
于 2015-09-27T11:40:47.183 回答
8

你可以试试这样的...

#! /bin/bash
for ((a=022; a <= 658 ; a++))
do
   printf "./filter filename%04d.bmp outputfile lower upper" $a | "sh"
done
于 2012-06-12T22:43:29.363 回答
2

您可以利用xargs迭代:

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

笔记:

  • {} 对应管道输出的一行,这里是输入文件名。
  • 输出文件将使用后缀“_out”命名。
于 2017-02-15T09:59:33.233 回答
1

你可以AS-IS在你的 shell 中测试它:

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

如果您有特殊路径,*请通过您的路径 + a glob 进行更改:例如:

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

http://mywiki.wooledge.org/glob

于 2012-06-12T22:32:42.983 回答
0

这同时添加输出图像的名称,例如filtered_filename0055.bmp

for i in *; do
    ./filter $i filtered_$i lower upper
done
于 2012-06-12T22:35:26.203 回答