有大神能帮忙改个脚本吗,就 1 句话,不知道能不能实现。

2022-03-29 10:37:40 +08:00
 yyysuo

脚本如下: #!/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

3885 次点击
所在节点    NAS
27 条回复
defunct9
2022-03-29 11:22:59 +08:00
不用改
Removable
2022-03-29 11:28:33 +08:00
@defunct9 #1 我还以为老哥要开 ssh 上去看看
yyysuo
2022-03-29 11:28:44 +08:00
@defunct9 实际上就是不生效了啊,缓存文件原来都在 /tmp/emby/transcoding-temp/下面,现在都在 /tmp/emby/transcoding-temp/下面的名称不确定的子文件夹下面了。
yyysuo
2022-03-29 11:30:07 +08:00
我查命令,-R 是显示缓存目录及子目录所有文件,但是 ls -R /tmp/emby/transcoding-temp/*.ts -t|tail -100|xargs rm -rf 是不生效的。
pengtdyd
2022-03-29 11:40:26 +08:00
xargs -n1 -I {} rm -rf {}
dier
2022-03-29 11:42:15 +08:00
我没用过这个服务,所以不太清楚生成的目录结构。
先了解一下:
你是要删除 /tmp/emby/transcoding-temp/ 下的随机单独子目录还是随机子目录中的超过 50M 的文件?如果删除了超过 50M 的文件,父目录是不是空了,空目录还要保留吗?另外文件数超过 120 ,是指定 /tmp/emby/transcoding-temp/ 下的随机单独子目录超过 120 还是随机单独子目录下的文件超过 120 ?
yyysuo
2022-03-29 11:43:06 +08:00
@pengtdyd 大神,能把命令写全吗,我是完全没有这一块的基础,是这样吗:ls -R /tmp/emby/transcoding-temp/*.ts -t|tail -100|xargs -n1 -I {} rm -rf {}
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`
pengtdyd
2022-03-29 11:44:10 +08:00
@yyysuo 试试啊,我没有环境,也不知道你的执行结果是什么
yyysuo
2022-03-29 11:45:25 +08:00
@dier 我是要删除 /tmp/emby/transcoding-temp/ 下的随机单独子目录中的超过 50M 的文件,文件数也是指单独随机子目录的文件数,如果随机名的子文件夹删空了,也要保留,但是正常是不会删空的。
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 的文件
yyysuo
2022-03-29 11:50:09 +08:00
@dier 提示 find: missing argument to `-exec'
goodryb
2022-03-29 11:50:50 +08:00
@yyysuo #9 如果是子目录中的,那每个子目录是不是要单独判断。如果是的话先把子目录列表 ls 出来,然后循环判断每个子目录里面的情况,这个逻辑就和你现在判断 transcoding-temp 是一样的了。
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`
dier
2022-03-29 12:05:25 +08:00
删除超过 120 的文件或目录 `cd /tmp/emby/transcoding-temp/ && ls -t | tail -n +120 | xargs rm -rf`
dier
2022-03-29 12:07:07 +08:00
补充一下,上面会直接删除目录,如果你想要超过 120 之后再执行删除最早的大于 50M 文件而不删除目录的话这个不能满足,
zanelee
2022-03-29 14:40:35 +08:00
换个思路,加个 for 。先得到现在 /tmp/emby/transcoding-temp/所有的目录,然后 for 循环每个目录,循环里面在直接用你原来这个应该可行
yyysuo
2022-03-29 14:41:27 +08:00
@zanelee 好的,多谢,我找找示例,如果您方便,给个示例也可以。
zanelee
2022-03-29 14:53:25 +08:00
@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
yyysuo
2022-03-29 14:54:08 +08:00
@zanelee 非常感谢,我试一下。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/843560

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX