"找-mtime +5 | xargs rm -rf"即使存在超过5天的文件,也会销毁整个目录

时间:2017-10-03 19:35:25

标签: bash unix server synology

我有一系列文件夹,子文件夹和这样的文件:

year_folder
    month1_folder
       day1_folder
           filea, fileb
       day2_folder
           filea
    month2_folder

我想要删除超过X天的文件夹和文件。 我试过了

find /c/Documents/year_folder -mtime +5 | xargs rm -rf

此命令行完全适用于我的测试文件夹(在我的计算机上本地)。 但是当我在synology上运行脚本时,它会以某种方式删除整个year_folder。

不幸的是,我不知道如何在synology服务器上测试我的脚本,以了解我做错了什么。

1 个答案:

答案 0 :(得分:4)

使用GNU扩展

将其拆分为两部分:

  • 删除超过五天的文件(仅限!)

    # for GNU find; see below for POSIX
    find "$root" -type f -mtime +5 -delete
    
  • 删除空目录

    # for GNU find; see below for POSIX
    find "$root" -depth -type d -empty -delete
    

当您使用rm -rf时,如果目录本身在五天内未更新,则您将删除整个目录。但是,如果您创建或修改a/b/c,则不会更新a的修改时间(或者,如果修改不要求更新目录本身) ,甚至不是a/b的那个 - 因此,你的"修改时间超过五天"当你递归地应用它时,规则是破坏性的。

上面唯一的警告是,它可能不会在运行时删除多个空目录层 - 也就是说,如果a/b/c为空,并且a/b为空,而不是{{1然后,第一次运行时只能删除c,并且在删除c之前可能还需要另一次调用。

支持基线POSIX

POSIX a/b不支持find。因此,第一个命令变为:

-delete

同样,它不支持find "$root" -type f -mtime +5 -exec rm -rf -- {} + 。但是,因为-empty在传递非空目录时会失败,所以很容易让那些引用非空目录的实例失败:

rmdir

如果你不习惯这样做,那么事情就会变得更加棘手。使用shell来测试每个目录是否为空的实现可能如下所示:

find "$root" -depth -type d -exec rmdir -- {} +