删除所有旧文件、文件夹和子文件夹的命令

删除所有旧文件、文件夹和子文件夹的命令

我需要一个命令来删除超过 31 天未更新的所有文件、文件夹和子文件夹。我试过这个

find . -mindepth 1 -mtime +31 -exec rm -rf "{}" \;

但如果我有这样的层次结构

.
├── old_sub_folder1
└── old_sub_folder2
    ├── old_file
    └── old_sub_folder3
        └── new_file

其中old_*是旧文件夹\文件,new_file是新文件。

该命令将删除所有内容。因为日期创建old_sub_folder2后没有更新。new_file

我需要一个不会删除 old_sub_folder2/old_sub_folder3/new_file 的命令

答案1

问题是您将-r选项添加到rm命令中。即使文件夹不为空,这也会删除它们。

您需要分两步执行此操作:

  1. 仅删除旧文件

    find . -type f -mtime +31 -delete

  2. 要删除任何旧文件夹,如果它们是空的,我们可以看一下这里,并稍微调整一下:

    find . -type d -empty -mtime +31 -delete

答案2

find  . -type d ! -name . -mtime +31 -exec sh -c '
   case $(find "$1" ! -mtime +31 -exec echo x \; -prune) in
      "" ) rm -rf "$1" || echo "Error could not delete folder \"$1\"" ;;
   esac
' {} {} \;

从当前目录中,我们启动find并仅查看directories自过去 31 天以来尚未更新的目录。在每个目录中,我们依次深入并查找不超过 31 天的任何内容,找到它后,我们会回显一个虚拟字符,并修剪任何向前搜索(理想情况下,我们应该通过以下方式终止我们的搜索)-quit但这不是POSIX我们所接受的-prune)。

然后我们查找此find操作的结果,如果结果为空,我们就知道甚至没有一个元素(文件/目录/链接/等)是新的,因此这个目录。可以安全删除。

相关内容