我需要一个命令来删除超过 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
命令中。即使文件夹不为空,这也会删除它们。
您需要分两步执行此操作:
仅删除旧文件:
find . -type f -mtime +31 -delete
要删除任何旧文件夹,如果它们是空的,我们可以看一下这里,并稍微调整一下:
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
操作的结果,如果结果为空,我们就知道甚至没有一个元素(文件/目录/链接/等)是新的,因此这个目录。可以安全删除。