批量转换十六进制文件名至十进制:Shell命令执行报错求助
批量将十六进制命名文件转为十进制的正确方法
错误原因分析
你之前的命令把mv的参数顺序搞反了:mv -- "$(($f))" $f里,第一个参数是转换后的十进制文件名(此时这个文件根本不存在),mv自然会报错找不到源文件。正确的顺序应该是现有文件名在前,新文件名在后。
解决方案
情况1:已经移除了.wav扩展名
直接调整mv的参数顺序即可,同时加上双引号避免文件名含空格时出问题:
for f in *; do mv -- "$f" "$(($f))" done
如果要避免误处理非十六进制命名的文件,可以加个正则匹配,只处理0x开头的纯十六进制文件:
for f in 0x*; do if [[ "$f" =~ ^0x[0-9a-fA-F]+$ ]]; then mv -- "$f" "$(($f))" fi done
情况2:保留.wav扩展名直接处理(更高效,不用先删扩展名)
可以通过参数展开分离文件名和扩展名,转换后再拼接回去:
for f in 0x*.wav; do # 去掉末尾的.wav,得到十六进制部分 hex_part="${f%.wav}" # 转换为十进制 dec_num="$((hex_part))" # 重命名 mv -- "$f" "${dec_num}.wav" done
内容的提问来源于stack exchange,提问作者Kostov
相关产品推荐
相关产品推荐

