![Linux shell脚本:删除名称中不包含“01”的所有文件](https://linux22.com/image/522102/Linux%20shell%E8%84%9A%E6%9C%AC%EF%BC%9A%E5%88%A0%E9%99%A4%E5%90%8D%E7%A7%B0%E4%B8%AD%E4%B8%8D%E5%8C%85%E5%90%AB%E2%80%9C01%E2%80%9D%E7%9A%84%E6%89%80%E6%9C%89%E6%96%87%E4%BB%B6.png)
我有一个备份脚本,它以创建日期命名的文件,格式为 backups_YYYYMMDD.tar.gz
我目前使用以下命令清除超过 30 天的所有内容:
find /backups -mtime +30 -name "backups_????????.tar.gz" -delete
我该如何改变它来清除那些不是在每月第一天制作的文件?即任何与“backups_??????01.tar.gz”匹配的文件都会保留下来。
答案1
您可以按照现在使用的方式,通过简单的通配符来实现:
find /backups -mtime +30 -name "backups_????????.tar.gz" ! -name "backups_??????01.tar.gz" -delete
“查找已存在超过 30 天且名为 FOO 而不是名为 BAR 的文件并将其删除。”
答案2
假设您在下面的所有目录中都没有备份文件,您可以执行以下操作:
find . -type f -regextype posix-egrep ! -regex ".*backups_[0-9]{6}01.tar.gz" -name '*.tar.gz' -print0 | xargs -0 rm
如果不知道这些目录中的所有文件,就很难说清楚,所以先运行它而不使用 rm!您可能希望将最后的 *.tar.gz glob 修改为更接近原始 glob 的内容。