2016-11-28 12 views
-1

ubuntuシェルでプログラム(myAppと言う)を実行しようとしています。 通常、myAppは次のように呼び出されます。myApp /path/to/file1 /path/tofile2出力は、標準出力に印刷されるマトリックスです。異なるパラメータでプログラムを実行し、結果をtxtファイルに保存する

私がしたいことは、ディレクトリ内のすべてのファイルに対して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

参照[なぜあなたはLS(1)の出力を解析するべきではありません] (http://mywiki.wooledge.org/ParsingLs) – Inian

+1

'ch0_ * 000000 {0..483..4} .pcd'も動作するはずですか? '/ tmp'の下にファイルがどのように存在しているか教えてください。で/ tmpにこのような一見 – Inian

+0

ファイル: 'ch0_000000000.pcd ch0_000000001.pcd ... ch0_000000010.pcd ... ch0_000000483.pcd ' と私はエコーで4回ごとのファイル名を印刷する場合ははい、それは動作します。 – Sven0

答えて

0

リンクの他に、Inianは - why you shouldn't parse the output of ls(1)を与えました - あなたはbashのforループの中で "次の"アイテムを得ることはできません(少なくとも私の知る限り)。

あなたはになります。は、の最後のアイテムを覚えています。

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では、出力ファイルはループごとに上書きされます。 >>の出力にはが付加されます。です。必要に応じて調整します。私のために働いた
+0

DevSolarに感謝します。予期せぬトークン 'fi 'の近くでスクリプト'構文エラーを実行しようとすると、このメッセージが表示されます。 私はif部分をコメントアウトしていますが、最初は1つのファイル名しか解析できません。 – Sven0

+0

@ Sven0:出力ファイル名を処理されたファイル( '$(basename $ i。pcd)_out.txt')。 – DevSolar

+0

本当ですが、私の場合は実際には1つのファイルに入れる方が便利です。 私が持っているような 'if ... fi'問題で私を助けてもらえますか?なぜbashは 'fi'コマンドを認識しませんか? – Sven0

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 
関連する問題