Bash脚本中mv命令导致文件消失问题求助
问题排查与修正:Bash脚本重命名文件后"消失"的原因
核心错误:变量赋值写法错误
你的脚本里filename= echo $FILE | head -c 15这一行完全写错了——没有正确把命令的输出捕获到变量里。这种写法会把filename设为空值,然后单独执行echo $FILE | head -c 15,导致后续combined_name变成".csv"(空字符串加后缀)。执行mv $FILE $combined_name时,实际是把目标文件重命名为隐藏文件.csv,所以你在目录里看不到,误以为文件消失了。
正确捕获命令输出的写法应该用$(...)包裹命令:
filename=$(echo "$FILE" | head -c 15)
其他优化细节
- 变量加双引号:所有涉及文件名的变量都要套双引号,避免文件名含空格、特殊字符时出错,比如
"$FILE"、"$combined_name"。 - 缩小遍历范围:直接用通配符
*"$string_contains"*遍历目标文件,减少不必要的判断。 - 合并条件判断:把两个
if合并成一个,让代码更简洁。
修正后的完整脚本
#!/bin/bash string_contains="dummy_axial_y_position" string_dontwant="dummy_axial_y_position_time" file_extension=".csv" # 直接遍历包含目标字符串的文件 for FILE in *"$string_contains"* do # 合并条件:包含目标字符串且排除指定字符串 if [[ "$FILE" != *"$string_dontwant"* ]]; then # 正确捕获命令输出到变量 filename=$(echo "$FILE" | head -c 15) combined_name="$filename$file_extension" echo "重命名 $FILE -> $combined_name" # 变量加引号,兼容特殊文件名 mv "$FILE" "$combined_name" fi done
找回"消失"的文件
在脚本所在目录执行ls -a命令,就能看到那个名为.csv的隐藏文件,执行mv .csv 你想要的文件名即可恢复。
内容的提问来源于stack exchange,提问作者nonjorman
相关产品推荐
相关产品推荐

