我想编写一个简单的脚本来执行以下操作:
- 从音频文件(WAV、FLAC、MP3 和 AIFF)读取元数据
- 如果比特率低于阈值,则返回错误消息
- 将文件重命名为特定格式,例如艺术家-标题-年份等
- 将其移动到另一个文件夹
我的 shell 脚本经验非常有限,但我想知道是否有人可以为我指明正确的方向,特别是在阅读元数据方面。如果有人可以提出一种编写 shell 脚本的替代方法,那也会很有用!
答案1
我喜欢你的态度,因为你不会要求任何人“做作业”并填鸭式地给出答案。
您将需要使用一个程序,例如exiftool
读取和输出文件元数据的程序。在这种情况下,exiftool
您可以选择要输出的元数据标签,例如exiftool -maxbitrate filename
。首先在不带任何选项的示例文件上运行程序,以便浏览可用标签,然后选择您感兴趣的标签。请注意,虽然标签可能显示大写且嵌入空格,但您可以以编程方式使用它们,不带空格且不区分大小写,例如。元数据标签“最大比特率”将被指定为命令行选项-maxbitrate
。
如果您选择exiftool
,并且利用其选项-printFormat
自定义输出来帮助您以所需的格式获取用于重命名文件的元数据元素,则可以节省许多步骤。此功能的一个示例用法是exiftool -Bitdepth -MaxBitRate -p 'blah $Bitdepth blah $Maxbitrate' your_file.mp3
。阅读man
页面了解详细信息。
对于其他元数据程序,您可能需要使用第二个程序来解析结果,例如awk
仅获取感兴趣的数据字段(在您的情况下为比特率),并使用 shell 的算术比较测试,例如-lt
或-gt
来标记错误。
至于脚本的其余要求,重命名和移动操作可能可以一步完成。挑战将是获取您正在寻找的信息。同样,您选择的元数据程序(例如exiftool
)将为您提供该信息。
答案2
bash
解决方案与媒体信息工具(方便地统一显示视频和音频文件最相关的技术和标签数据):
#!/bin/bash
dest="/path/to/dir" # path to destination directory
trsh=256 # threshold
IFS='|' # input field separator
while read -r author title year bitrate; do
if [[ "$((bitrate/1000))" -lt $trsh ]]; then
echo "Bitrate is below $trsh Kbps"
exit 1
fi
mv "$1" "${dest}/${author}-${title}-${year}.${1##*.}"
done < <(mediainfo --Inform="General;%Performer%|%Track%|%Recorded_Date%|%BitRate%" "$1")