A ディレクトリには拡張子「*.f90」のファイルが複数あります。シェルスクリプトの各ファイルに次のコマンドを適用したいと思います。たとえば、ファイル名。f90
f2py -h filename.pyf -m filename /path/to/directory-A/filename.f90
これにより、ディレクトリBに保存したい「.pyf」ファイルが作成されます。
次のスクリプトを使用しています。
find "/path/to/directory-A/" -name "*.f90" -exec f2py -h {}.pyf -m {} {}.f90\;
これは find 関数の出力を取得し、-exec コマンドの「{}」に置き換えます。これは私のコードでは、「{}」のすべての場所が「filename.f90」に置き換えられていることを意味します。 execコマンドに "{}"の代わりにファイル名(拡張子なし)を入れたいからです。
ファイル名のみを提供するbasenameコマンドを試しましたが、元の実行コマンドの「{}」にはまだ拡張子が含まれています。次のコードを使用しました。
find "/path/to/directory-A/" -name "*.f90" -exec basename\ {} \ .f90; -exec f2py -h {}.pyf -m {} {}.f90\;
この問題をどのように解決できますか?また、Bディレクトリにコマンドを実行して、Bディレクトリに ".pyf"ファイルが生成されるようにしたいと思います。どうすればいいですか?
答え1
私が好きな行の1つを使用するには:
cd directory-A
for i in *p90; do f2py -h ${i%.p90}.pyf -m ${i%.p90} $i; mv ${i%.p90}.pyf directory-B; done
「拡張子」は、UNIXファミリーオペレーティングシステムのファイル名の奇妙な部分にすぎず、特別な処理がないことを理解する必要があります。
ファイル名にスペースやその他の奇妙な記号が含まれている場合は、行の引用符を変更する必要があります。
答え2
find "/path/to/directory-A/" -name "*.f90" -exec /path/to/callf2py {} \;
f2pyを呼び出します。
#!/bin/sh
f=$(basename $1)
f2py -h $f.pyf -m $f.f90