【问题标题】:Bash: using {} to replace filename extensionBash:使用 {} 替换文件扩展名
【发布时间】:2015-11-15 16:29:57
【问题描述】:

我正在测试带有参数扩展的 bash 文件名替换,如下所示:How to change file extension in Linux shell script?

但是,我似乎无法按我的意愿执行以下操作:

给定以下文件:

tmp/01. Losing A Whole Year.flac
tmp/02. Narcolepsy.flac

我将 find 用于 flac 文件到 parallel 运行 echo 命令以测试输出。我正在尝试用.mp3 替换.flac

find tmp -type f -name '*.flac' | time parallel -j+0 --eta 'echo "{} {.flac%%.mp3}"'

我的输出是:

tmp/01. Losing A Whole Year.flac {.flac%%.mp3}
tmp/02. Narcolepsy.flac {.flac%%.mp3}

如果有影响的话,我打算将它与 ffmpeg 一起使用。

编辑: 预期输出:

tmp/01. Losing A Whole Year.flac tmp/01. Losing A Whole Year.mp3
tmp/02. Narcolepsy.flac tmp/02. Narcolepsy.mp3

编辑 2: 要替换文件扩展名,我可以使用:

find tmp -type f -name '*.flac' | time parallel -j+0 --eta 'echo "{} {.flac%%.mp3}"'

但是,这提供了以下输出

tmp/01. Losing A Whole Year.flac tmp/01.\ Losing\ A\ Whole\ Year.mp3
tmp/02. Narcolepsy.flac tmp/02.\ Narcolepsy.mp3

现在可能这是一个 ffmpeg 问题,因为如果有 \ 字符代替空格字符,ffmpeg 将无法找到文件。

【问题讨论】:

  • 事情没有按预期工作,因为您使用的是并行替换,而不是 Bash。 Bash 替换以 $ 为前缀。

标签: bash parameter-expansion


【解决方案1】:

我想我明白了:

find tmp -type f -name '*.flac' | time parallel -j+0 --eta 'echo "{} {.}.mp3"'

会产生预期的结果。

虽然,我不知道为什么这不起作用:

find tmp -type f -name '*.flac' | time parallel -j+0 --eta 'echo "{} {.flac}.mp3"'

编辑: 虽然上述方法似乎可行,但插入 \ 字符以替换空格,这将导致 ffmpeg 找不到所需的文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-06
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多