在Unix中,我有一个类似于以下代码的代码
find /dir -name "filename*" -type f -print | xargs rm
case "$?" in
"0") status="SUCCESS";;
*) status=FAILED";;
esac
它一直在返回FAILED,我认为这是因为在删除文件之前执行了case语句。也许如果我在第一个语句后添加一些等待时间,我可以确定该文件已被完全删除。如果是这种情况,那么如何在脚本中添加一些等待时间,如60秒?
编辑:我应该提到正在删除文件,但退出状态不为零。答案 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.