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

标签 linux loops file-io

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

./filter inputfile outputfile lower upper

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

最佳答案

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

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

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

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

这将为您提供从 filename22.bmpfilename680.bmp 的列表。这只是处理您提到的范围的迭代。这不包括零填充数字。为此,您可以使用 printfprintf 语法是printf 格式参数。我们可以使用之前循环中的 $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 格式的可执行文件。

关于linux - 如何在 Linux 的终端中循环执行命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11005756/

相关文章:

linux - 如何使用 ffmpeg 高质量将 flv 转换为 avi

loops - Powershell自定义对象-不传递foreach变量

java - 不写入文本文件

c - 是什么导致这个内存位置在某些情况下被破坏,而在其他情况下却没有?

linux - find.pm 错误 "encountered a second time"

mysql - 为什么我在 MySQL 中的进程由于某种原因而消失了?

python - 在 Python 中打印表格

r - write.csv 用于大型 data.table

linux - 执行 if...then...fi 时出现 Cygwin 错误 - Bash 脚本

android - 你如何循环线程?