删除文件后,Linux中的find and delete命令返回退出状态1

时间:2018-07-02 07:33:30

标签: linux shell

我正在使用linux脚本,其中我必须删除7天之前创建的目录。我发现了一个执行相同的命令。下面是命令

find /some/thing/ -type d -mtime +7 -exec rm -rf {} \;

但是当我使用echo $?检查命令的退出状态时,即使从该位置删除了文件,它也会返回1。

要使用旧时间戳创建目录,我正在使用以下命令集。创建一个文件夹,然后将日期修改为2018-05-10

mkdir sample
touch -t 1805100000.00 sample

2 个答案:

答案 0 :(得分:2)

发现的人说

  如果成功处理了所有文件,

查找将以状态0退出,   如果发生错误,则大于0。这故意是非常广泛的   描述,但如果返回值非零,则不应依赖   关于查找结果的正确性。

这意味着如果无法删除至少一个目录,则查找返回除1外的其他内容。如果存在类似目录的结构

/some/thing/subdir
/some/thing/subdir/subsubdir

并且两个子目录都可以删​​除,然后find可以先删除/some/thing/subdir,然后删除/some/thing/subdir/subsubdir失败,因为它不再存在。


编辑

原始答案包含解释原因,但不包含如何解决的建议。 Deleep的注释建议使用-depth参数来强制查找过程在目录本身之前处理每个目录的内容。确实有效:

find /some/thing/ -type d -mtime +7 -depth -exec rm -rf {} \;

答案 1 :(得分:1)

我认为您正在混淆可能影响exec状态的可能原因。文件是否已正确删除,对find命令的退出状态没有影响,因为传达文件删除错误的唯一方法是rm的退出代码,并且已执行程序的退出代码将被忽略。您可以尝试尝试轻松地验证这一点,例如

find . -type f -prune -exec false \;

如果在此处检查 find 的退出代码,则它将为0,尽管(通过构造)每个已执行的命令都会返回非零的退出状态。

对于您来说,问题出在您使用-rf时。这样做,您已经先删除了整个目录树,然后要求 find 将文件显示给“ -exec”中的命令。使用-depth选项使 find 使用深度优先搜索,您就不会遇到问题。

还请注意,使用这种方法时,您不检查目录的创建时间,而是检查修改时间。这只是为了澄清-也许这就是您想要的,尤其是因为您仍然无法获得目录创建时间。

另一个问题是,您是否真的要遍历目录树,或者仅遍历顶层目录是否足够?换句话说,如果您有目录./top1/bootom1.top2/bottom2,并且top1和bottom2昨天已被修改,但是top2和bottom1已有数周未修改,您是否真的要删除{{1 }}(保留top1的其余部分不变)和bottom1(包括其子目录)?您当前的方法可以做到这一点,如果这是您想要的,那当然是正确的事情。