.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.sh
。bash.sh
私はプログラムですsubmission.sh
。read 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つだと思います。ここでは、リーダーとライターの間で同期が必要であり、信頼境界が存在する場合も存在しない場合もあります。