2016-12-28 3 views
1

特定のファイルをバックアップ場所にコピーするFortran 90コードにコマンドを含めることを試みています。単純にファイルをコピーすると、コードはファイル名に数字を付加したファイルをコピーするbashのライナーが1つ

cp -f myfile.nml output/codebkp/myfile.nml 

となりますが、以前のファイルがあるかどうかを特定できるものを探していました。たとえば、前にファイルが存在しない場合は、myfile.nml.00にコピーします。ディレクトリに既にmyfile.nml.02がある場合は、myfile.nml.03にコピーします。

私はFortranコードに入れているので一種のライナーでなければならないので、私はCALL SYSTEM()ステートメントを使用することを余儀なくされました。私が作ることができ

最高の試みが

cp myfile.nml output/codebkp/myfile.nml.$((`ls output/codebkp/myfile.nml.* | awk '{print $NF}' | awk -F '.' '{print $NF}'`+1)) 

のようなものですが、(驚くべきことに、まだ種類のエラーでさえも動作しますが)それは私に何のファイルがありませんエラーを与え、もう動作しません。 2つのファイルの後に私にこのエラーを与えます

bash: 1 
2+1: syntax error in expression (error token is "2+1") 

アイデアはありますか?

ところで、私はそこからそれを行うには良い方法がないことを知っているので、私はFortranでこのようにしています。しかし、CALL SYSTEM()以外の方法があれば教えてください!

+0

が(Fortranで)あなたは、単に問い合わせ・バイ・ファイル名でループを持つことはできません心、あるいはそれがためにはbashがありますか? – francescalus

+1

複数行のbash(またはPythonなどの)スクリプトを作成してファイルに保存し、fortranのone-linerコマンドを使用してそのファイルを呼び出すことができます。 –

+0

@francescalus私は本当によくfortranを知らない。私はできると思うが、私はちょうど方法を知らない。私はfortranで事実上ゼロ経験を持っています – TomCho

答えて

0

私のbash(GNU bash、バージョン4.4.5)では、初めてコマンドがうまくいきました。

しかし、2回目は機能しませんでした。 LSはすべてのnmlファイルをyeldsし、あなたが望むかもしれないmiddle awkは最後のファイルを分離していません。

$ls myfile.nml.* |awk '{print $NF}' |awk -F'.' '{print $NF}' 
>02 
>3 

中間のawkを末尾に置き換えた場合、-1が動作するはずです。

$ls myfile.nml.* |tail -1 |awk -F'.' '{print $NF}' 
>3 
$cp myfile.nml.3 myfile.nml.$((`ls myfile.nml.* |tail -1 |awk -F'.' '{print $NF}'` + 1)) 
$ls myfile.nml.* 
>myfile.nml.02 myfile.nml.3 myfile.nml.4 

PS:行方不明ゼロ....

+0

@TomChoこれはあなたのために機能しましたか? –

+0

ええ、私は実際にはこのバージョンには達していませんでした。このバージョンには、 '' "max" 'ls output/codebkp/param.nml。* | tail -1 | awk -F ' &nbsp param.nml出力/ codebkp/param.nml.printf '%02d' $((max + 1)) '' '{print $ NF} ';最大値$ {max#0};& ! ' – TomCho

関連する問題