作成された.datファイル名に基づいてbashスクリプトで整数を変更する方法

作成された.datファイル名に基づいてbashスクリプトで整数を変更する方法

.dat私のbashスクリプトで新しく作成されたファイル名と形式に基づいて文字列を更新したいと思います。私がやろうとしていることは次のとおりです。

  • blabla_3200.datたとえば、bashスクリプトで名前付きファイルを使用し、そのスクリプトを使用してケースを実行します。
  • この例を完了したら、blabla_3300.dat同じディレクトリに新しい例を作成します。
  • blabla_3300.dat次の実行では、同じbashスクリプトの最後の実行を使用したいと思います。

したがって、ファイル名から最大の整数を検索し、.datそれsedを使用して次のようにbashスクリプトを更新する必要があります。

sed -i 's/3200/max/g' mybash.sh

次に、新しいケースを実行します。

どんな助けでも大変感謝します。良い一日をお過ごしください!

コメントを消去

私はより明確でなければならなかった。

同じディレクトリにblabla_3200.dat、があると仮定しますsubmission.shbash.sh

私はプログラムですsubmission.shread data blabla_3200.datその後、実行を開始します。

submission.shこのファイルをslurmマシンに呼び出すには、sbatch submission.sh次のコマンドを実行します。bash.sh

その後、実行が終了し、プログラムはblabla_4500.dat同じディレクトリに出力ファイルを作成します(何が作成されるのかわかりません。たとえばblabla_8254.datなど)。

私が望むのは、bash.shのコードは、新しい出力が表示されるたびにsubmit.shのデータ読み取りコマンドを更新する必要があることです。これで、submit.shでread data blabla_4500.datコマンドを実行する必要があります。

答え1

ソフトリンクを使用してくださいln -s blabla_3300.dat .next

.nextその後、スクリプトにrm .next;ln -s blabla3400.dat .next

答え2

私はディレクトリ内のすべてのファイルのSHA256ハッシュを計算する簡単な例を考えました。無害で問題がないか簡単に確認できます。他の処理を使用することができる。

#!/bin/sh
inotifywait -m "$@" -e create | while read dir event file; do
    if [ -f "${dir}${file}" ]; then
        sha256sum "${dir}${file}"
    fi
done

これにはいくつかの問題がありますが、すべて解決するのは簡単ではありません。

  • ファイル名に改行があるとどうなりますか?これは2つの別々の要素として扱われますが、さらに悪いことに、これらのファイルを作成する人がスクリプト内の任意の他のファイルを処理できるようにすることができます。理論的には、ファイル名には現れない唯一の文字である区切り文字を使用できますが、このオプションは使用\0できません。おそらく使用せずにinotifywaitを繰り返し呼び出して、1つの出力= 1つのファイルがわかるようにする方が良いかもしれません。しかし、そうすれば多くのアクションを見逃すことがあります!$IFS--format-m
  • ファイルをすばやく作成してすばやく削除すると、イベントが見つからない可能性があります。実際にはそれより悪いです。誰かが通常のファイルを作成し、スクリプトを実行して削除し、[ -f ${dir}${file} ]シンボリックリンクを作成し、スクリプトが任意のファイルに対して操作を実行できるようにします。だから私が\0仕事を上手にしても構いません。
  • 処理速度が遅い。ファイルが生成されるよりも処理時間が長くなると、遅延時間が長くなり、上記の問題がさらに悪化します。これは良いバッチで簡単に修正できます&:)
  • 半分だけ作成されたファイルを読みます。close_writeこのイベントを使用するか、別の場所にファイルを作成して完了したら、監視対象のディレクトリに移動してこれを防ぐことができます。

私はこれがシェルスクリプトで実行すべきではないことの1つだと思います。ここでは、リーダーとライターの間で同期が必要であり、信頼境界が存在する場合も存在しない場合もあります。

関連情報