【问题标题】:Using filenames with spaces and gawk使用带空格和 gawk 的文件名
【发布时间】:2013-08-15 06:42:08
【问题描述】:

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

【问题讨论】:

标签: bash gawk


【解决方案1】:

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

【讨论】:

  • 但我不只是想用 mp3 替换 wma。请参阅更新的问题。抱歉不准确。
  • 不幸的是,这似乎不起作用。我收到类似ffmpeg -i 01 Track 1.wma 的命令。
  • 不,ffmpeg 给出输出Unable to find a suitable output format for ''
  • 没有空格的简单测试命令有效吗?测试一下。同样,这对我有用(archlinux 和 ffmpeg 2.0)
【解决方案2】:

在我看来,要摆脱文件名中的空格来进行这种看似简单的文件名转换并不容易,我想出了一个在 python 中适用于我的三行解决方案:

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

我花了 2 分钟在 python 中完成这项工作。 Bash 似乎不适合这个简单的任务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-07
    • 2011-01-24
    • 2023-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多