执行具有不同参数的程序并将结果存储在txt文件中

时间:2016-11-28 09:01:03

标签: linux bash shell

我正在尝试在ubuntu shell中执行一个程序(比如说myApp)。 通常myApp的调用方式如下:myApp /path/to/file1 /path/tofile2输出是一个矩阵,将打印在标准输出上。

我想要做的是为目录中的所有文件执行myApp并将输出保存在txt文件中。最后一部分,我希望很容易,我打算用myApp /path/to/file1 /path/tofile2 > myOutputfile.txt

我真的很难自动调用所有文件。 如果试图这样做:

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

所以我的问题是我无法访问列表中的下一个文件名以将其传递给myApp。我到目前为止所做的是在现有文件字符串中添加“+1”。 如何从返回的ls输出中获取下一个文件? 谢谢!

2 个答案:

答案 0 :(得分:0)

除了Inian给出的链接 - why you shouldn't parse the output of ls(1) - 你无法在bash for循环中获取“下一个”项目(至少据我所知)。

可以做的事情是记住 last 项目。

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

注意:

  • 使用直接通配符代替$(ls ...)
  • for之后没有分号。
  • 无需$f1$f2
  • 使用> myOutput.txt,您的输出文件将被覆盖每个循环; >>输出将追加。根据需要进行调整。

答案 1 :(得分:0)

替代解决方案对我有用:

for i in {0..3..1}; do 
    f1="/home/gv/Desktop/PythonTests/ch0_000000$i.txt"    
    k=$(($i+1)) 
    f2="/home/gv/Desktop/PythonTests/ch0_000000$k.txt"
    #myApp /tmp/$f1 /tmp/$f2 > myOutput.txt
    echo "F1 = $f1 and F2=$f2"
    ls $f1
    ls $f2
done

在你的情况下应该像这样工作:

for i in {0..483..4}; do 
f1="/tmp/ch0_000000$i.pcd"    #or "/tmp/ch0_$i.pcd" , not clear how your files are numbered.
k=$(($i+1)) 
f2="/tmp/ch0_000000$k.pcd"    #or "/tmp/ch0_$k.pcd" , not clear how your files are numbered.
myApp $f1 $f2 > myOutput.txt
#echo "F1 = $f1 and F2=$f2"
#ls $f1
#ls $f2
done