You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

脚本执行删除匹配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)。

快速排查步骤

  1. 先看脚本实际要删的文件:把脚本里的删除命令改成“预览模式”,比如把rm ...改成echo rm ...,把find ... -delete改成find ... -print,运行脚本后看输出的文件名,对比你直接执行时的结果,就能快速定位差异。
  2. 检查脚本的shell环境:看脚本开头的shebang(比如#!/bin/bash),和你直接执行时用的shell(输入echo $SHELL查看)是否一致。
  3. 确认脚本是否切换了目录:检查脚本里有没有cd /usr/local/nginx/html这一行,如果没有,后续的相对路径命令都会在/home/ubuntu下执行,肯定会出问题。
  4. 对比脚本命令和直接执行的命令:逐字核对,看有没有漏写后缀、引号差异、参数遗漏(比如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:30:46