使用 find 和 xargs 时,如何仅在第一个命令成功时才运行第二个命令?

使用 find 和 xargs 时,如何仅在第一个命令成功时才运行第二个命令?

我的情况是:

我有许多文件,其名称timestep1_i代表 i 的许多值,并且我尝试将 timestep1 的所有文件与名为 的程序合并combinefiles。我想使用 find | 并行执行此操作(对于 timestep2 timestep3 ...) xargs。

为此,我有一个名为“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文件夹中。显然意味着即使第一个命令没有成功,第二个命令也会运行

我究竟做错了什么?我可以更改什么,以便函数 merge_and_move 仅在combinefiles程序成功时移动文件?

答案1

当 mergefiles 完成时 - 无论成功还是被终止,它都应该产生一个返回代码。在执行 mv 命令之前测试此返回代码。

例如,您可以从 shell 运行“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/

相关内容