我已经从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}"
答案 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会找到word
与parameter
末尾的最短匹配并将其删除。 (注意word
是一个shell glob,而不是一个正则表达式。)在out case中,word
是/*
,它匹配斜杠后跟任何字符。因为这会删除最短的匹配,所以这只会从参数中删除文件名部分。
来自man bash
:
$ {parameter%word}
$ {parameter %% word}
删除匹配的后缀模式。扩展单词以生成模式,就像在路径名扩展中一样。如果模式 匹配参数展开值的尾部,然后展开的结果是展开的值 删除了最短匹配模式(%'' case) or the longest matching pattern (the
%%''情况)的参数。 如果参数为@或*,则依次对每个位置参数和扩展应用模式删除操作 是结果列表。如果参数是使用@或*下标的数组变量,则模式删除操作为 依次应用于数组的每个成员,扩展是结果列表。