我有一个我想用 gawk 处理的文件列表。这是我的命令:
ls -1 *.wma | gawk '{printf("ffmpeg -i %s track4-%s.mp3\n",$0, $1);}'
但由于原始文件名包含空格,我得到类似的命令
ffmpeg -i 02 Track 2.wma track4-02.mp3
这不起作用,因为空间没有转义。任何想法如何做到这一点?
预期的输出应该是
ffmpeg -i 02\ Track\ 2.wma track4-02.mp3
在我看来,没有简单的方法可以摆脱文件名中的空格来进行这种看似简单的文件名转换,我想出了一个在 python 中适用于我的三行解决方案:
import glob
for filename in glob.glob("*.wma"):
print "ffmpeg -i {0} track4-{1}.mp3".format(filename.replace(' ','\ '),filename[:2])
我花了 2 分钟在 python 中做到这一点。Bash 似乎不适合这个简单的任务。
这是一个无用和错误的使用ls
,试试这个,而不是使用glob:
for file in *.wma; do
mp3=$(sed -r 's@([0-9]+)\s+Track\s+[0-9]+\.wma@track4-\1.mp3@' <<< "$file")
ffmpeg -i "$file" "$mp3"
done
ls
是一种交互式查看文件信息的工具。它的输出是为人类格式化的,并且会导致脚本中的错误。使用 glob 或 find 代替。了解原因: http: //mywiki.wooledge.org/ParsingLs