移除文件名前导数字前缀的Bash函数在.bashrc中执行无输出求助
问题
我在Manjaro系统的用户主目录.bashrc文件中定义了一个名为Convert_Filenames_Remove_Leading_Number_Prefix的Bash函数,用于将格式为0 - FILENAME.mkv的文件重命名为FILENAME.mkv,目前仅支持.mkv、.mp4、.mp3、opus格式文件。每次更新该函数后,我都会执行source .bashrc使其生效,但该函数在.bashrc中执行时输出为空,单独在Shell中运行却能正常工作。请问我哪里操作出错了?
原函数代码:
Convert_Filenames_Remove_Leading_Number_Prefix() { ConversionTemporary="/run/media/sarah/MSS_EXtended/Conversion Temporary" TemporaryDir="/tmp/T1" mkdir "$ConversionTemporary" mkdir "$TemporaryDir" echo "Convert_Filenames_Remove_Leading_Number_Prefix()" echo "NOTES: Currently Works on .mp4, .mp3, opus, and .mkv files only. Converts: 0 - FILENAME.EXT -> FILENAME.EXT\n" #Copy to conversion temporary for safekeeping cp -a "`pwd`" "$ConversionTemporary" echo "Copying files to ConversionTemporary complete" #Main Sequence for i in *.{mkv,mp4,mp3,opus}; do filaname=$(echo "$i" | cut -d "-" -f2 | awk '{$1=$1};1') echo "Result: $filename" mv -v "$i" "$filename" done }
错误分析
- 变量拼写错误:函数里把
filename拼写成了filaname,导致后续调用$filename时是空值,输出自然为空,mv命令也会执行失败。 - glob匹配问题:当当前目录没有对应格式的文件时,
*.{mkv,mp4,mp3,opus}会原样展开成字符串,而非跳过循环,可能导致无效操作。 - mkdir未加-p参数:如果目录已经存在,
mkdir会报错中断函数执行,无法继续后续逻辑。 - echo换行符问题:Bash的
echo默认不解析\n转义字符,会直接输出成原字符串,导致提示格式混乱。 - cp命令逻辑问题:
cp -a "pwd" "$ConversionTemporary"会把当前目录整个复制到目标目录下,导致备份文件嵌套在子目录里,不符合备份单文件的预期。
修正后的函数代码
Convert_Filenames_Remove_Leading_Number_Prefix() { ConversionTemporary="/run/media/sarah/MSS_EXtended/Conversion Temporary" TemporaryDir="/tmp/T1" # 加-p参数,目录存在时不报错 mkdir -p "$ConversionTemporary" mkdir -p "$TemporaryDir" echo "Convert_Filenames_Remove_Leading_Number_Prefix()" # 加-e参数解析换行符 echo -e "NOTES: Currently Works on .mp4, .mp3, opus, and .mkv files only. Converts: 0 - FILENAME.EXT -> FILENAME.EXT\n" # 仅复制目标格式文件到备份目录,忽略无匹配时的报错 cp -a *.{mkv,mp4,mp3,opus} "$ConversionTemporary" 2>/dev/null echo "Copying files to ConversionTemporary complete" # 开启nullglob,无匹配文件时循环不执行 shopt -s nullglob for i in *.{mkv,mp4,mp3,opus}; do # 修正变量拼写错误 filename=$(echo "$i" | cut -d "-" -f2 | awk '{$1=$1};1') echo "Result: $filename" mv -v "$i" "$filename" done # 恢复nullglob默认设置 shopt -u nullglob }
额外说明
shopt -s nullglob确保没有匹配文件时循环直接跳过,避免处理无效的文件名字符串。2>/dev/null用来屏蔽cp命令在无匹配文件时的报错信息,让输出更干净。mkdir -p避免因目录已存在导致的函数中断问题。echo -e让提示信息里的换行符正常生效,格式更清晰。
内容的提问来源于stack exchange,提问作者Sarah Szabo
相关产品推荐
相关产品推荐

