我正在使用linux脚本,其中我必须删除7天之前创建的目录。我发现了一个执行相同的命令。下面是命令
find /some/thing/ -type d -mtime +7 -exec rm -rf {} \;
但是当我使用echo $?
检查命令的退出状态时,即使从该位置删除了文件,它也会返回1。
要使用旧时间戳创建目录,我正在使用以下命令集。创建一个文件夹,然后将日期修改为2018-05-10
mkdir sample
touch -t 1805100000.00 sample
答案 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
(包括其子目录)?您当前的方法可以做到这一点,如果这是您想要的,那当然是正确的事情。