I am trying to execute a program (let’s say myApp) in the ubuntu shell.
Normally myApp is called like this: myApp /path/to/file1 /path/tofile2
the output is a matrix which will be printed on the standard output.
What i want to do is to execute myApp for all files in a directory and save the output in a txt file. The last part, i hope is easy which i intend to do with myApp /path/to/file1 /path/tofile2 > myOutputfile.txt
.
I am really stuck with calling all files automatically. If have tried to do this:
for i in $(ls /tmp/ch0_*000000{0..483..4}.pcd); do f1=$i f2=$i+1 # i also tried f2=i+1 myApp /tmp/$f1 /tmp/$f2 > myOutput.txt done
so my problem is that i cannot get to the next filename in the list to pass it to myApp. what i am doing so far is adding ‘+1’ to the existing file string. How can i get the next file from the returned ls output? thanks!
Advertisement
Answer
Aside from the link Inian gave — why you shouldn’t parse the output of ls(1) — you cannot get the “next” item in a bash for
loop (at least, to my knowledge).
What you can do is remember the last item.
unset last_i # Fudging the wildcarding a bit as it is unclear # what your `ls` was supposed to achieve. # This is assuming at least one matching file exists, # otherwise you will get one loop with, literally, # i=/tmp/ch0_*.pcd for i in /tmp/ch0_*.pcd do if [[ ! -z $last_i ]] then myApp $last_i $i >> myOutput.txt fi last_i="$i" done
Note:
- Use direct wildcarding instead of
$(ls ...)
. - No semicolon after
for
. - No need for
$f1
,$f2
. - With
> myOutput.txt
, your output file will be overwritten for each loop; with>>
output will be appended. Adjust as necessary.