find と xargs を使用する場合、最初のコマンドが成功した場合にのみ、2 番目のコマンドをどのように実行できますか?

find と xargs を使用する場合、最初のコマンドが成功した場合にのみ、2 番目のコマンドをどのように実行できますか?

私の状況は次のとおりです

私は名前がtimestep1_iiの多くの値を表す多くのファイルを持っており、timestep1のすべてのファイルをというプログラムとマージしようとしていますcombinefiles。 find | xargsを使用してこれを並列に実行する(timestep2 timestep3...)。

これには、「combine_and_move」という bash 関数があります。

function combine_and_move {
  file_name1=`echo $1 | sed 's/timestep1_0/timestep1/'`
   echo "*** file $file_name1 ***"
   $UTIL_DIR/combinefiles $file_name1 &&  mv "$file_name1"_* uncombined_files
}
export -f combine_and_move

この関数はファイル名を受け取り、すべてのファイルを結合し、すでに結合されているファイルを別のディレクトリに移動するプログラムを呼び出します。最後の部分は歌演出を引き受けたそうです&&

次に、次のようにfind xargsを使用して関数を呼び出します。

find . -maxdepth 1 -name 'timestep*_0' -print0 | xargs --replace=@ -0 -P 64  bash -c 'combine_and_move $"@"' _ &

システム管理者がプロセスをランダムに終了できることを理解してください。

uncombined_files機能は機能しますが、時々プロセスが終了すると、そのフォルダにファイルが移動することがあります。明らかに、最初のコマンドが成功しなくても、2番目のコマンドが実行されることを意味します。

私は何が間違っていましたか?combinefilesプログラムが成功した場合にのみ、merge_and_move関数にファイルを移動させるにはどうすればよいですか?

答え1

マージファイルが完了したら、成功したかどうかにかかわらず戻りコードを生成する必要があります。 mv コマンドを実行する前に、この戻りコードをテストしてください。

たとえば、シェルで "echo$?" を実行すると、前のコマンドの戻りコードを表示できます。正常な実行の場合は0が表示されますが、CTRL-C(SIGINT)で停止したコマンドの場合は130が表示されます。多くの終了コードをテストし、その値を指定してからmvを実行するかどうかを決定できます。独自の終了コードを指定することもできます。

おそらく、次のリンクが役に立ちます。

https://tldp.org/LDP/abs/html/exit-status.html

https://www.cyberciti.biz/faq/bash-get-exit-code-of-command/

関連情報