OMG*_*chy 5 bash arch-linux shell-script
我有一组 .wav 格式的音乐,想使用 neroAacEnc 将其转换为 .aac/.mp4。
我该怎么做呢?我正在使用 Arch Linux x86_64 和 Xterm。
这是您可以在终端中键入的快速单行:
find . -name "*.wav" -print0 | while read -d $'\0' file; do neroAacEnc -2pass -q 1 -if "$file" -of "${file%wav}m4a"; done
Run Code Online (Sandbox Code Playgroud)
您也可以使用 ffmpeg,正如@slm 所建议的那样,
find . -name "*.wav" -print0 | while read -d $'\0' file; do ffmpeg -i "$file" -c:a libfdk_aac -vbr 3 output.m4a "${file%wav}m4a"; done
Run Code Online (Sandbox Code Playgroud)
我不确定 neroAacEnc 与 ffmpeg 相比如何,但我知道 ffmpeg 非常受许多 Linux 用户欢迎。
解释
find是一个程序,它返回与某个文件属性匹配的文件的路径,在这种情况下是文件名。如果您只想知道当前路径的子目录中的 .wav 文件是什么,您可以执行find . -name "*.wav". 通常这会在一个新行上输出每个文件。这-print0使它用空字符分隔匹配项。当我们将输出传递给下一个命令时,这允许正确处理带有空格的文件名。
这个|角色被称为管道。它告诉 shell 获取左边命令的输出并将其作为输入传递给右边的命令,在这种情况下,read是while循环中的命令。
该read命令用于获取输出find并将其分配给变量“文件”。通常,这会一次为每个单词“文件”分配值,但这-d $'\0'$会导致分配由空字符分隔(与我们find使用-print0标志分隔文件的方式相匹配)。
while 循环导致read为每个匹配的文件名迭代地为“文件”分配值。的do和done是一个while循环标准的bash语法的一部分:
while <something is true>; do
<run some commands>
done
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我们的“运行一些命令”是ffmpeg或neroAacEnc。在每种情况下,输入文件(即$file)是用我们分配的“文件”变量指定的read,输出文件(即${file%wav}w4a)是对这个变量的操作,它允许我们为文件指定不同的名称输出。通常$file或${file}会评估文件的名称,比如some song.wav。的%说,从变量的右切断匹配的字符[1]〜的权的任何序列%(即,“WAV”)。所以${file%wav}会评价一些歌曲。,然后“m4a”是文件名的新结尾:some song.m4a。
[1] 为简单起见,我在这里说“字符”。右边的序列%可以是正则表达式。例如,如果我们说${file%w*v}变量是some song.w1234v,它也会评估为some song。.