【问题标题】:Bash script to convert music from one directory into another将音乐从一个目录转换到另一个目录的 Bash 脚本
【发布时间】:2014-12-21 13:54:16
【问题描述】:

我已经从 arch 论坛修改了这个脚本:https://wiki.archlinux.org/index.php/Convert_Flac_to_Mp3#With_FFmpeg

我正在尝试在目录结构中查找特定文件类型,将它们转换为另一种音乐文件类型,然后将它们放在保持相同目录结构的“转换后”目录中。

我一直在剥离字符串 $b 的文件名。

$b 持有字符串./converted/alt-j/2012\ an\ awesome\ wave/01\ Intro.flac

有没有办法可以从字符串中删除文件名?我不认为 ffmpeg 可以创建/强制输出文件的父目录。

#!/bin/bash
# file convert script
find -type f -name "*.flac" -print0 | while read -d $'\0' a; do
    b=${a/.\//.\/converted/}
    < /dev/null ffmpeg -i "$a" "${b[@]/%flac/ogg}"
    #echo "${b[@]/%flac/ogg}"

【问题讨论】:

    标签: bash ffmpeg


    【解决方案1】:

    我一直在剥离字符串 $b 的文件名。

    让我们从b开始:

    $ b=./converted/alt-j/2012\ an\ awesome\ wave/01\ Intro.flac
    

    要删除文件名,留下路径:

    $ c=${b%/*}
    

    验证结果:

    $ echo "$c"
    ./converted/alt-j/2012 an awesome wave
    

    要确保目录c 存在,请执行以下操作:

    $ mkdir -p "$c"
    

    或者,一步到位:

    $ mkdir -p "${b%/*}"
    

    工作原理

    我们正在使用 shell 的后缀删除功能。在${parameter%word} 形式中,shell 找到wordparameter 结尾的最短匹配并将其删除。 (注意word 是一个shell glob,而不是一个正则表达式。)在这种情况下,word/*,它匹配一个斜线后跟任何字符。因为这会删除最短的匹配项,所以只会删除参数中的文件名部分。

    后缀去除详细文档

    来自man bash

    ${parameter%word}
    ${parameter%%word}
    删除匹配的后缀模式。单词被扩展以产生一个模式,就像在路径名扩展中一样。如果图案 匹配参数扩展值的尾随部分,则扩展的结果是扩展值 具有最短匹配模式的参数(%'' case) or the longest matching pattern (the%%'' 案例)已删除。 如果参数为@或*,则对每个位置参数依次应用模式去除操作,展开 是结果列表。如果 parameter 是下标为 @ 或 * 的数组变量,则模式删除操作为 依次应用于数组的每个成员,展开就是结果列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-19
      • 1970-01-01
      • 2011-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-08
      相关资源
      最近更新 更多