2016-11-03 13 views
2

入力として、いくつかのファイルにシェルスクリプトを実行しますディレクトリには、私は多くのファイルを持っています:*.inpと私はそれらのすべてのためにこのコマンドを実行し、結果を*.outに保存したいと思います。これを達成するためにシェルスクリプトのみを使用できますか?は、私は次の形式のシェルコマンドを持って

for file in *.inp ; do 
    my_cmd -I "${file}" -O "${file%%.inp}.out" 
done 

${file%%.inp}は、いわゆるparameter expansionです:

+1

は平均的な質問のように聞こえましたが、多くの良い回答が得られましたので、質問は結局良いと思いました:) –

答えて

5

あなたが単純なループを使用することができます。これは、入力ファイル名から拡張子.inpを効果的に削除します。


ありがとうございました(感謝Jean-FrançoisFabre)。フォルダに.inpファイルが含まれていない場合は、上記のループは*.inp$fileで1回実行されます。あなたがnullglobオプションを設定する必要があることを避けるために:

shopt -s nullglob # set the nullglob option 
for file in *.inp ; do 
    my_cmd -I "${file}" -O "${file%%.inp}.out" 
done 
shopt -u nullglob # unset the nullglob option 
+1

'$ file'がファイルであるかどうかを調べるテストを追加します。 1)ディレクトリである可能性があります.2)ディレクトリに '.inp'ファイルがない場合、' * .inp'でコマンドを呼び出します。 –

+0

答えはOPによって尋ねられた問題に焦点を当てるべきです。あなたが提案したものは、OPのために実装する価値があるかもしれませんが、私の答えでは話題にはなりません。 – hek2mgl

+0

@ Jean-FrançoisFabreあなたは2番目のポイントについて正しいです。いいキャッチ! – hek2mgl

-3
ls *.inp| xargs -l1 -I % my_cmd -I % -O %.out 
+0

いいえいいえいいえ。 lsの出力を解析しないでください。 http://mywiki.wooledge.org/ParsingLs – hek2mgl

+0

@Aaronいいえ、できません。これは(例えば) 'ls'が問題の文字を含むとすぐにファイル名を修正するためです。 'find'はそれをしません。 'ls'の結果を解析しないでください。期間。 – hek2mgl

+0

私は同意するが、私は今混乱している。あなたのコメントを確認してください。それはタイプミスですか? – hek2mgl

4

デフォルトで

parallel my_cmd -I {} -O {.}.out ::: *.inp 

GNU parallel

使用して、並行して、この意志の仕事、コアあたりつのジョブ。 {}は変更されていない引数で、 {.}は同じ引き数からその拡張子を引いたものです。引数は、 :::に続く単語から取られます。

関連する問題