使用带空格和gawk的文件名

时间:2013-08-14 21:47:46

标签: bash gawk

我有一个我想用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

2 个答案:

答案 0 :(得分:0)

这是useless and buggy use of ls,请尝试使用

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是用于交互式查看文件信息的工具。它的输出格式化为人类,并将导致脚本中的错误。使用globs或代替。了解原因:http://mywiki.wooledge.org/ParsingLs

答案 1 :(得分:0)

在我看来,没有简单的方法来摆脱文件名中的空格来进行看似简单的文件名转换,我提出了一个在python中适合我的三行解决方案:

import glob
for filename in glob.glob("*.wma"):
    print "ffmpeg -i {0} track4-{1}.mp3".format(filename.replace(' ','\ '),filename[:2])

我花了2分钟在python中执行此操作。 Bash似乎不适合这个简单的任务。