Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to loop an executable command in the terminal in Linux?

Let me first describe my situation, I am working on a Linux platform and have a collection of .bmp files that add one to the picture number from filename0022.bmp up to filename0680.bmp. So a total of 658 pictures. I want to be able to run each of these pictures through a .exe file that operates on the picture then kicks out the file to a file specified by the user, it also has some threshold arguments: lower, upper. So the typical call for the executable is:

./filter inputfile outputfile lower upper

Is there a way that I can loop this call over all the files just from the terminal or by creating some kind of bash script? My problem is similar to this: Execute a command over multiple files with a batch file but this time I am working in a Linux command line terminal.

like image 295
Linux Rules Avatar asked Jun 12 '12 22:06

Linux Rules


People also ask

How do I run a loop in Linux terminal?

The basic syntax of a for loop is: for <variable name> in <a list of items>;do <some command> $<variable name>;done; The variable name will be the variable you specify in the do section and will contain the item in the loop that you're on.

What is the command to repeat the command you just executed?

Press CTRL+P to switch to the last command, and then press CTRL+O to execute it. This will do the wonder. No configuration needed! You can use CTRL+O as many times as you want to keep re-executing the last commands.

How do I run the same command multiple times in Linux?

Repeating a Command Using 'for' Loop You can use a 'for' loop to print a certain command multiple times. There are different variations of the 'for' loop, and we will explore all of them with the help of different bash scripts.


2 Answers

You may be interested in looking into bash scripting.

You can execute commands in a for loop directly from the shell.

A simple loop to generate the numbers you specifically mentioned. For example, from the shell:

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

This will give you a list from filename22.bmp to filename680.bmp. That simply handles the iteration of the range you had mentioned. This doesn't cover zero padding numbers. To do this you can use printf. The printf syntax is printf format argument. We can use the $i variable from our previous loop as the argument and apply the %Wd format where W is the width. Prefixing the W placeholder will specify the character to use. Example:

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

In the above $() acts as a variable, executing commands to obtain the value opposed to a predefined value.

This should now give you the filenames you had specified. We can take that and apply it to the actual application:

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

This can be rewritten to form one line:

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

One thing to note from the question, .exe files are generally compiled in COFF format where linux expects an ELF format executable.

like image 115
Steve Buzonas Avatar answered Oct 24 '22 23:10

Steve Buzonas


here is a simple example:

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

to append to a file:(>> is used to append, you can also use > to overwrite)

for i in {1..100}; do echo "Hello Linux Terminal" >> file.txt; done
like image 27
vishal Avatar answered Oct 25 '22 00:10

vishal