这是我的媒体服务器:
我有一个包含我所有电视节目的文件夹,对于某些节目,我会无限期地保留它们,而对于其他节目,我想在它们的保质期达到 90 天后清除它们。
因此,我想根据路径填充一个节目列表,这些节目希望在 TXT 文件中于 90 天后被清除,并且有一个计划脚本将每天运行该列表。
这样,我就可以从 TXT 列表中添加或删除节目,然后知道我有 90 天的时间观看该列表中的任何节目,之后这些节目的剧集将被删除。
当然,我想清除视频文件而不是其他文件,例如季节文件夹、艺术品等。因此,典型的扩展名列表 - mkv、mp4、mpg、mpeg、avi、xvid、ts 将会消失,但文件夹结构不会消失。
我已经找到了很多关于清除 X 天前的文件的方法,但没有找到这么具体的。
当我在 Windows PC 上拥有媒体文件时,我运行了一个名为自动删除的简单程序,您可以在其中指定文件夹、日期和扩展名,它会处理所有事情,但自从转移到 Ubuntu 后,我发现情况不再一样了。
任何帮助均感激不尽。
答案1
不需要任何额外的程序甚至脚本,find
只需一次调用即可完成。
我假设你有一个这样的目录树:
.
├── delete
├── GoT
│ ├── artwork.png
│ ├── S10E05_Everybody_dies.mkv
│ └── stream.ts
├── TBBT
│ └── Season_01
│ ├── file.avi
│ └── notes
└── The_Wire
├── current.mp4
└── wallpaper.jpg
该文件的内容delete
如下:
/full/path/to/GoT
/full/path/to/TBBT
此find
命令将在每个目录中搜索具有指定扩展名且使用期限超过89
天的文件:
find $(</path/to/delete) -type f \( -name "*.mkv" -o -name "*.mp4" -o -name "*.mpg" -o -name "*.mpeg" -o -name "*.avi" -o -name "*.xvid" -o -name "*.ts" \) -mtime +89
我的示例的输出是:
/full/path/to/GoT/stream.ts
/full/path/to/GoT/S10E05_Everybody_dies.mkv
/full/path/to/TBBT/Season_01/file.avi
使用它来测试命令。如果它执行了你想要的操作,只需将其添加-delete
到结束执行删除的命令:
find $(</path/to/delete) -type f \( -name "*.mkv" -o -name "*.mp4" -o -name "*.mpg" -o -name "*.mpeg" -o -name "*.avi" -o -name "*.xvid" -o -name "*.ts" \) -mtime +89 -delete
您可以定期运行这最后一个命令,例如使用 cronjob(但SHELL=/bin/bash
首先在 crontab 中设置,默认cron
使用dash
!) - 关键字@daily
可能会有用:
@daily find $(</path/to/delete) …
关于路径中的空格的说明:我真的建议总体上删除目录和文件名中的空格,但如果您确实需要在路径中有空格,您可能需要IFS=$'\n'
首先设置为仅允许换行符作为参数的分隔符。
答案2
好的,这是我的反馈。
是的,脚本可以运行,但是有一个大警告。
如果找不到“删除”文件,它无论如何都会成功运行,但针对所有文件,并适用于您在命令行中的任何位置。
- 有没有办法检查文件是否存在?
我尝试在删除文件中添加引号来处理空格,但效果不佳。所以我执行了你的建议。
这是确切的运行命令:
IFS=$'\n' && find $(</opt/deletelist) -type f \( -name "*.mkv" -o -name "*.mp4" -o -name "*.mpg" -o -name "*.mpeg" -o -name "*.avi" -o -name "*.xvid" -o -name "*.ts" \) -mtime +89
我确实得到了我预期的结果,所以它确实有效。