Bash脚本将音乐从一个目录转换为另一个目录

时间:2014-10-26 04:15:16

标签: bash ffmpeg

我已经从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}"

1 个答案:

答案 0 :(得分:2)

  

我一直在剥离其文件名的字符串$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,而不是一个正则表达式。)在out case中,word/*,它匹配斜杠后跟任何字符。因为这会删除最短的匹配,所以这只会从参数中删除文件名部分。

后缀删除详细文档

来自man bash

  

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