脚本如下:
#!/bin/sh
FILE=ls /tmp/emby/transcoding-temp/*.ts -l|grep "^-"| wc -l
if [ ${FILE} -ge 120 ];then
find /tmp/emby/transcoding-temp/.ts -type f -size +50M -exec rm -rf {} ;
ls /tmp/emby/transcoding-temp/.ts -t|tail -100|xargs rm -rf
else
exit 0
fi
在 op 上用 docker 整了个 emby ,但是这货转码的缓存是放在硬盘上的,怕把我的 ssd 给写挂了,就把缓存目录映射到 tmp 文件夹了,自己费劲查资料写了个简单的脚本,每 5 分钟执行一次,去检查缓存目录 /tmp/emby/transcoding-temp/下的缓存文件,如果文件数大于 120 ,就把超过 50m 大小的最旧的缓存文件删除掉。
但是现在 emby 现在改了缓存的存储位置,原来是一股脑全放在 /tmp/emby/transcoding-temp/下面,现在每个播放进程都在 /tmp/emby/transcoding-temp/下单独建立了子文件夹,名字还是随机的,所以下面这句就得改改了,有大神能指点一下吗? find /tmp/emby/transcoding-temp/.ts -type f -size +50M -exec rm -rf {} ; ls /tmp/emby/transcoding-temp/.ts -t|tail -100|xargs rm -rf
1
defunct9 2022-03-29 11:22:59 +08:00
不用改
|
3
yyysuo OP @defunct9 实际上就是不生效了啊,缓存文件原来都在 /tmp/emby/transcoding-temp/下面,现在都在 /tmp/emby/transcoding-temp/下面的名称不确定的子文件夹下面了。
|
4
yyysuo OP 我查命令,-R 是显示缓存目录及子目录所有文件,但是 ls -R /tmp/emby/transcoding-temp/*.ts -t|tail -100|xargs rm -rf 是不生效的。
|
5
pengtdyd 2022-03-29 11:40:26 +08:00
xargs -n1 -I {} rm -rf {}
|
6
dier 2022-03-29 11:42:15 +08:00
我没用过这个服务,所以不太清楚生成的目录结构。
先了解一下: 你是要删除 /tmp/emby/transcoding-temp/ 下的随机单独子目录还是随机子目录中的超过 50M 的文件?如果删除了超过 50M 的文件,父目录是不是空了,空目录还要保留吗?另外文件数超过 120 ,是指定 /tmp/emby/transcoding-temp/ 下的随机单独子目录超过 120 还是随机单独子目录下的文件超过 120 ? |
7
yyysuo OP @pengtdyd 大神,能把命令写全吗,我是完全没有这一块的基础,是这样吗:ls -R /tmp/emby/transcoding-temp/*.ts -t|tail -100|xargs -n1 -I {} rm -rf {}
|
8
dier 2022-03-29 11:43:51 +08:00
@yyysuo ` ls -R /tmp/emby/transcoding-temp/*.ts -t|tail -100|xargs rm -rf `不生效是因为 `tail -100`这个写法是错的,应该是`tail -n 100`
|
10
yyysuo OP @dier 我是要删除 /tmp/emby/transcoding-temp/ 下的随机单独子目录中的超过 50M 的文件,文件数也是指单独随机子目录的文件数,如果随机名的子文件夹删空了,也要保留,但是正常是不会删空的。
|
11
dier 2022-03-29 11:45:48 +08:00
`find /tmp/emby/transcoding-temp/ -maxdepth 2 -type f -size +50M -exec rm -rf {}` 加上`-maxdepth 2`这个能删除 /tmp/emby/transcoding-temp/目录下随机子目录中超过 50M 的文件
|
13
goodryb 2022-03-29 11:50:50 +08:00
@yyysuo #9 如果是子目录中的,那每个子目录是不是要单独判断。如果是的话先把子目录列表 ls 出来,然后循环判断每个子目录里面的情况,这个逻辑就和你现在判断 transcoding-temp 是一样的了。
|
14
dier 2022-03-29 12:01:07 +08:00
@yyysuo 提示 find: missing argument to `-exec' 那就换成`find /tmp/emby/transcoding-temp/ -maxdepth 2 -type f -size +50M |xargs rm -rf`
|
15
dier 2022-03-29 12:05:25 +08:00
删除超过 120 的文件或目录 `cd /tmp/emby/transcoding-temp/ && ls -t | tail -n +120 | xargs rm -rf`
|
16
dier 2022-03-29 12:07:07 +08:00
补充一下,上面会直接删除目录,如果你想要超过 120 之后再执行删除最早的大于 50M 文件而不删除目录的话这个不能满足,
|
17
zanelee 2022-03-29 14:40:35 +08:00
换个思路,加个 for 。先得到现在 /tmp/emby/transcoding-temp/所有的目录,然后 for 循环每个目录,循环里面在直接用你原来这个应该可行
|
19
zanelee 2022-03-29 14:53:25 +08:00 1
@yyysuo 大概就是这样,那个 DIR 找到的目录会自带 /,所以$dir*.ts==xxx/*.ts,就是找到原本缓存目录下再 1 级的目录下的以 ts 结尾的文件
#!/bin/sh TEMP_ROOT="/tmp/emby/transcoding-temp" DIR=`ls -F $TEMP_ROOT| grep '/$'` for dir in $DIR; do FILE=`ls $TEMP_ROOT/$dir*.ts -l|grep "^-"| wc -l` if [ ${FILE} -ge 120 ];then find $TEMP_ROOT/$dir*.ts -type f -size +50M -exec rm -rf {} ; ls $TEMP_ROOT/$dir*.ts -t|tail -100|xargs rm -rf else exit 0 fi done |
21
zanelee 2022-03-29 14:59:58 +08:00 1
/tmp/emby/transcoding-temp/xxx/1.ts
|
22
zanelee 2022-03-29 15:03:45 +08:00
@zanelee 文件目录是这种样子的话,就 xxx 目录下面都是那些.ts 结尾的话,这两句改成
find $TEMP_ROOT/$dir -type f -size +50M -exec rm -rf {} ; ls $TEMP_ROOT/$dir -t|tail -100|xargs rm -rf |
23
yyysuo OP @zanelee
有 2 种播放场景,一种是播放电影,一种是播放 IPTV ,这 2 种方式的文件结构不太一样。 第 1 种播放电影文件结构: /tmp/emby/transcoding-temp 下面有:2EED80 文件夹 B19FD8 文件夹下面有: 文件夹:2EED80_Fonts (空文件夹) 2EED80.m3u8 2EED80_0.ts 2EED80_1.ts 2EED80_2.ts.tmp 脚本结果: 当满足 EED80 文件夹下的文件超过 120 个的条件时,脚本会一次性删除名称不定的子文件夹下面的文件,也会删除文件夹本身,也可能是删除末尾 100 个文件的命令瞬间重复执行了多次,不知道为什么。 第 2 种观看 IPTV 结构: /tmp/emby/transcoding-temp 下面有:B19FD8 文件夹 0d1cfc9928974c4cb6e0d2397e7ea698.ts B19FD8 文件夹下面有: B19FD8.m3u8 B19FD8_0.ts B19FD8_1.ts B19FD8_2.ts.tmp 脚本结果:运行良好 |
24
yyysuo OP @yyysuo 已经确认脚本非常棒,没有任何问题,是需要调整脚本的执行频繁和每次删除的缓存数,删除策略太激进,会把 emby 未播放的缓存也删除,导致 emby 自身认为缓存出错,重置缓存了。
|
26
openbsd 2022-03-30 10:11:08 +08:00
大佬们都不用 find 的 -delete 参数吗 [狗头保命]
|
27
yyysuo OP 根据大神的脚本和我的使用情况调整了一下,在定时任务里面 5 分钟执行一次脚本,脚本检查子文件夹中的文件数量,大于 500 则删除掉末尾的 200 ,这样存量缓存一直有 300 个,大约占用 500M 的内存空间,大家如果用的话根据自己的剩余内存数调整一下保留的缓存文件数量。
#!/bin/sh TEMP_ROOT="/tmp/emby/transcoding-temp" DIR=`ls -F $TEMP_ROOT| grep '/$'` find /tmp/emby/transcoding-temp/*.ts -type f -size +500M -exec rm -rf {} \; for dir in $DIR; do FILE=`ls $TEMP_ROOT/$dir*.ts -l|grep "^-"| wc -l` if [ ${FILE} -ge 500 ];then find $TEMP_ROOT/$dir*.ts -type f -size +50M -exec rm -rf {} ; ls $TEMP_ROOT/$dir*.ts -t|tail -200|xargs rm -rf else exit 0 fi done |