Bash脚本遍历目录重命名srt文件出现command not found错误如何解决
错误原因
- 第二行语法错误:你同时嵌套了
$()和反引号两种命令替换符号,会导致shell先执行find管道输出的内容,把输出的目录名当成命令执行,所以第一个目录名Lawless被识别为要执行的命令,才会报Lawless: command not found的错误。 - 手动转义目录名的逻辑完全多余,Bash中只要给变量加双引号引用,天然就能处理带空格、特殊字符的路径,自行转义反而会引入额外问题。
- 其他潜在问题:直接用
cd $dirm没有判断是否进入成功,后续cd ..可能会跑到意料之外的路径;用ls+grep提取文件名的方式不稳定,遇到特殊文件名容易出错。
修复后的可用脚本
#!/bin/bash # 检查传入参数合法性 if [ $# -ne 1 ] || [ ! -d "$1" ]; then echo "用法: $0 <目标目录路径>" exit 1 fi # 遍历目标路径下的所有一级子目录 find "$1" -mindepth 1 -maxdepth 1 -type d | while read -r dirm; do echo "处理目录: $dirm" # 保存当前路径后进入目标目录,进入失败直接跳过避免路径混乱 pushd "$dirm" > /dev/null || continue # 提取视频文件名前缀 if ls *.mp4 >/dev/null 2>&1; then video_name=$(basename -- *.mp4 .mp4) elif ls *.mkv >/dev/null 2>&1; then video_name=$(basename -- *.mkv .mkv) else echo "目录 $dirm 未找到mp4/mkv视频文件,跳过" popd > /dev/null continue fi # 重命名字幕 mv -- *.srt "${video_name}.srt" echo "字幕已重命名为: ${video_name}.srt" # 回到之前的工作路径 popd > /dev/null done
内容的提问来源于stack exchange,提问作者user16819122
相关产品推荐
相关产品推荐

