V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要把任何和邀请码有关的内容发到 NAS 节点。

邀请码相关的内容请使用 /go/in 节点。

如果没有发送到 /go/in,那么会被移动到 /go/pointless 同时账号会被降权。如果持续触发这样的移动,会导致账号被禁用。
yyysuo
V2EX  ›  NAS

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

  •  
  •   yyysuo · 2022-03-29 10:37:40 +08:00 · 4107 次点击
    这是一个创建于 995 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    脚本结果:运行良好
    yyysuo
        24
    yyysuo  
    OP
       2022-03-29 18:55:18 +08:00
    @yyysuo 已经确认脚本非常棒,没有任何问题,是需要调整脚本的执行频繁和每次删除的缓存数,删除策略太激进,会把 emby 未播放的缓存也删除,导致 emby 自身认为缓存出错,重置缓存了。
    EvineDeng
        25
    EvineDeng  
       2022-03-29 22:20:19 +08:00
    @yyysuo ls -t 已经确保了文件是按时间排序的。
    openbsd
        26
    openbsd  
       2022-03-30 10:11:08 +08:00
    大佬们都不用 find 的 -delete 参数吗 [狗头保命]
    yyysuo
        27
    yyysuo  
    OP
       2022-03-30 15:33:29 +08:00
    根据大神的脚本和我的使用情况调整了一下,在定时任务里面 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
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2640 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 15:19 · PVG 23:19 · LAX 07:19 · JFK 10:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.