脚本执行删除匹配TS文件时误删其他文件问题求助
问题原因排查与解决方案
我碰到过好几个类似的案例,大概率是路径问题或者shell通配符/命令语法的细微差异在搞鬼,咱们一步步捋清楚:
可能的核心原因
1. 脚本未切换到目标目录,通配符展开异常
你直接在/usr/local/nginx/html下执行删除命令时,shell会在当前目录把sky2*.ts展开成具体的sky21.ts到sky29.ts文件名,传给rm或find;但如果脚本没先切换到这个目录,直接执行类似rm sky2*.ts的命令,shell会在脚本所在的/home/ubuntu目录下找匹配的文件——如果找不到,有些shell会把sky2*.ts这个通配符字符串原样传给命令,后续如果是find命令处理这个参数,就可能因为匹配规则的问题误删其他文件(比如如果find的路径写得不对,或者匹配模式没限制后缀)。
2. 脚本使用的shell与你直接执行的shell不一致
比如你直接用的是bash,但脚本开头的shebang是#!/bin/sh(部分系统中sh是dash的软链接),不同shell的通配符展开规则有差异:比如bash默认会把未匹配的通配符保留为原字符串,而dash可能有不同的处理逻辑,导致命令接收的参数不符合预期。
3. 脚本中的命令存在语法疏漏
比如你直接执行的是精确匹配sky2{1..9}.ts,但脚本里写成了sky2*(漏掉了.ts后缀),或者find命令没加-type f(可能匹配到目录)、没加-maxdepth 1(递归查找误删其他文件),甚至匹配模式写错成了*sky2*(会匹配包含sky2的所有文件,比如sky2.m3u8)。
快速排查步骤
- 先看脚本实际要删的文件:把脚本里的删除命令改成“预览模式”,比如把
rm ...改成echo rm ...,把find ... -delete改成find ... -print,运行脚本后看输出的文件名,对比你直接执行时的结果,就能快速定位差异。 - 检查脚本的shell环境:看脚本开头的shebang(比如
#!/bin/bash),和你直接执行时用的shell(输入echo $SHELL查看)是否一致。 - 确认脚本是否切换了目录:检查脚本里有没有
cd /usr/local/nginx/html这一行,如果没有,后续的相对路径命令都会在/home/ubuntu下执行,肯定会出问题。 - 对比脚本命令和直接执行的命令:逐字核对,看有没有漏写后缀、引号差异、参数遗漏(比如
find的-maxdepth、-type)。
正确的脚本写法示例
#!/bin/bash # 先切换到目标目录,切换失败直接退出,避免后续命令出错 cd /usr/local/nginx/html || exit 1 # 方式1:用大括号展开精确匹配sky21.ts到sky29.ts rm sky2{1..9}.ts # 方式2:用find命令更安全(避免通配符展开问题) # find . -maxdepth 1 -type f -name "sky2[1-9].ts" -delete
解释一下:
cd /usr/local/nginx/html || exit 1:确保只有切换目录成功才继续执行,防止在错误目录误删文件。sky2{1..9}.ts:这种展开方式比sky2*.ts更精确,只会匹配sky21.ts到sky29.ts,不会碰sky2.m3u8或其他无关文件。- 如果用
find,-maxdepth 1限制只在当前目录查找,-type f确保只删文件,-name "sky2[1-9].ts"精确匹配文件名。
内容的提问来源于stack exchange,提问作者C.Astraea
相关产品推荐
相关产品推荐

