【问题标题】:How do I convert a directory (including multiple subdirectories) of .flac files to .mp3s using Bash? [duplicate]如何使用 Bash 将 .flac 文件的目录(包括多个子目录)转换为 .mp3? [复制]
【发布时间】:2021-05-21 23:02:49
【问题描述】:

我有一个带有子目录的根目录,所有子目录都包含 .flac 文件。我想将所有 .flac 文件转换为 .mp3 文件,然后删除 .flac 文件,这样它们就不会占用过多的存储空间。

我有以下命令来转换 .flac 文件并删除它们,效果很好:

for f in *.flac; do flac -cd "$f" | lame -b 320 - "${f%.*}".mp3; done && rm -Rfv ./*.flac

您能帮忙在根目录和子目录上循环并执行转换和删除之后的命令吗?谢谢。

【问题讨论】:

  • **/*.flac 替换*.flac 可能就足够了(需要shopt -s globstar)。

标签: bash loops mp3 subdirectory flac


【解决方案1】:
find / -type f -iname '*.flac' | while read flac_file; do mp3_file=$(sed 's/\.flac/.mp3/gi' <<< ${flac_file}); flac -cd "${flac_file}" | lame -b 320 - "${mp3_file}"; [ -s "${mp3_file}" ] && rm -f "${flac_file}"; done

【讨论】:

    【解决方案2】:

    只需设置globstar 选项并使用**/*.flac 模式匹配当前目录及其子目录中的所有*.flac 文件。此外,您可能需要更改逻辑以删除转换后的 flac 文件。

    #!/bin/bash
    
    shopt -s globstar
    for f in **/*.flac; do
        flac -cd "$f" | lame -b 320 - "${f%.*}".mp3 # && rm "$f"
    done
    

    在确保它可以工作后,在&amp;&amp; rm "$f" 之前删除#

    【讨论】:

    • 非常感谢,这非常有效。请问,1)“shopt -s globstar”是做什么的?和 2) 有没有办法添加用户输入问题,以便提示您提交要执行操作的根目录的绝对路径?我意识到这些问题扩大了我原来的问题的范围,所以如果你不想回答它们也没问题。再次感谢。
    • @ktb 1) shopt -s globstar 设置globstar 选项。设置此选项后,用作单个模式的两个相邻的*s 将匹配文件名扩展上下文中的所有文件以及零个或多个目录和子目录。如果后跟/,则两个相邻的*s 将只匹配目录和子目录。 2) 类似的东西:read -p 'Enter base directory: ' basedir; cd "$basedir" || exit。这里,basedir 只是一个普通变量。您可以改用任何(有效)名称。
    【解决方案3】:

    怎么样

    for f in $(find . -type f -name \*.flac) ; do
      flac -cd "$f" | lame -b 320 - "${f%.*}".mp3 && rm "$f"
      done
    

    它将您当前目录树中的每个 *.flac 替换为 *.mp3 并删除原来的

    【讨论】:

    • 不要那样做。如果文件名包含空格,那将不起作用。 findls 一样糟糕在这种情况下。考虑阅读Why you shouldn't parse the output of ls
    • 如果名称中有空格(实际上是个坏主意),您可以将您的 flac ... 序列放入一个 shell 脚本(我们称之为 x.sh)并执行以下操作: -type f -name *.flac exec x.sh {} \;
    • 这将需要额外的工作并增加脚本的复杂性,而 glob 即使对于包含换行符的文件名也能简单而安全地工作。
    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-14
    相关资源
    最近更新 更多