如何在unix中执行下一个语句之前的语句之后添加等待时间

时间:2012-08-21 02:26:13

标签: shell unix scripting wait

在Unix中,我有一个类似于以下代码的代码

find /dir -name "filename*" -type f -print | xargs rm

case "$?" in
     "0") status="SUCCESS";;
      *) status=FAILED";;
esac

它一直在返回FAILED,我认为这是因为在删除文件之前执行了case语句。也许如果我在第一个语句后添加一些等待时间,我可以确定该文件已被完全删除。如果是这种情况,那么如何在脚本中添加一些等待时间,如60秒?

编辑:我应该提到正在删除文件,但退出状态不为零。

2 个答案:

答案 0 :(得分:2)

如果存在与您的filespec匹配的奇怪命名文件,那么您所做的事情就会出现问题。如果将find的输出传递给xargs,那么你将拥有历史悠久的Parsing LS问题

[ghoti@pc ~/tmp2]$ touch $'one\ntwo.txt' "three four.txt"
[ghoti@pc ~/tmp2]$ find . -name "*txt" -type f -print | xargs rm
rm: ./three: No such file or directory
rm: four.txt: No such file or directory
rm: ./one: No such file or directory
rm: two.txt: No such file or directory

为什么不直接在rm内处理您的find

find /dir -name "filename*" -type f -exec rm {} \;

要测试结果,您可以抓取$?

find /dir -name "filename*" -type f -exec rm {} \;
result=$?
case "$result" in
etc, etc

(我将$?放在变量中,以防以后再次使用它,或者其他命令需要在find和评估其返回值之间运行。)< / p>

或者你可以直接测试成功:

if find /dir -name "filename*" -type f -exec rm {} \;
then
    echo "SUCCESS!"
else
    echo "FAIL!"
fi

<强>更新

每条评论......如果您不必通过子目录进行递归,那么for循环可能就足够了。

for file in *.txt; do
  if ! rm "$file"; then
    echo "ERROR: failed to remove $file" >&2
  fi
done

或者,如果您不需要在单个文件上生成错误的粒度:

rm *.txt || echo "ERROR" >&2

我认为我不能让它变得更小。 :-P

答案 1 :(得分:1)

首先,我假设“类似于以下内容”包括在FAILED字符串文字周围包含两个引号。如果没有,你应该先修复它。

非常不可能case在前一个流程完成之前启动。如果没有使用&在后​​台运行某些东西,那就不是UNIX方式了: - )

您应该做的第一件事是将case语句替换为:

rc=$?
case $rc in
    0) status="SUCCESS";;
    *) status="FAILED"; echo rc=$rc;;
esac

查看返回代码实际是什么。然后查找man xargs$?始终是管道中最后一件事的退出代码),它会显示可能的值及其可能的原因。例如:

EXIT STATUS
    xargs exits with the following status:
         0 if it succeeds
       123 if any invocation of the command exited with status 1-125
       124 if the command exited with status 255
       125 if the command is killed by a signal
       126 if the command cannot be run
       127 if the command is not found
         1 if some other error occurred.
    Exit codes greater than 128 are used by the shell to indicate
    that a program died due to a fatal signal.