我正在尝试更好地组织我的音乐 m4a、mp3 等。由于文件已标记,我想我可以编写一个脚本来读取文件并从文件中提取专辑和艺术家信息,然后将文件 mv 到正确的文件夹中。在此过程中我也想学习一些AWK。
我开始于:
for file in *.m4a; do
tageditor get artist -f "$file" | awk '/Artist/{ print }'
done
输出:
Artist Periphery
Artist Meshuggah, Tomas Haake, Marten Hagström, Fredrik Thordendal,
Artist Varials, Bryan Garris
Artist Cannibal Corpse
Artist Lamb of God
Artist Ingested
Artist Linkin Park
Artist Car Bomb
Artist Whitechapel
Artist Divine Destruction
Artist Ingested, Sean Hynes, Sam Yates, Jason Evans, Lyn Jeffs
然后:
for file in *.m4a; do
tageditor get artist -f "$file" | awk '/Artist/{ print $2 }'
done
输出:
Periphery
Angelmaker,
Meshuggah,
Varials,
Cannibal
Lamb
Ingested
Linkin
Car
Whitechapel
Divine
Ingested,
我仍在尝试了解 awk 的工作原理,因此我重新编写了代码
对于 ./*.m4a 中的文件; do info=$(tageditor 获取艺术家专辑 -f "${file}") prt1=$(echo "$info" | awk 'sub(/^.{22}/,"")') prt2=$(echo "$prt1" | awk 'NR>2' ) art="$prt2" albm=$(echo "$prt2" | awk 'NR==1' ) band=$(echo "$art" | awk 'NR= =2' ) echo "$info" echo echo "$prt1" echo echo "$prt2" echo echo "$albm" #ALBUM echo echo "$band" #ARTIST echo
我得到:“./Do Not Look Down.m4a”的标签信息:
- MP4/iTunes 标签专辑 Koloss 艺术家 Meshuggah、Tomas Haake、Marten Hagström、Fredrik Thordendal、Tomas Haake
/不要往下看.m4a": [0m Koloss Meshuggah, Tomas Haake, Marten Hagström, Fredrik Thordendal, Tomas Haake
科洛斯·梅苏加、托马斯·哈克、马丁·哈格斯特罗姆、弗雷德里克·托登达尔、托马斯·哈克
科洛斯
Meshuggah、托马斯·哈克、马丁·哈格斯特罗姆、弗雷德里克·托登达尔、托马斯·哈克
如何使用 awk 删除最后一行 , 之后的所有内容。
答案1
出口工具是命令行工具(用 Perl 编写),可以从 shell 命令行或 shell 脚本执行您想要的操作(包括根据元数据移动和重命名文件)。
不要被名称中的“EXIF”所迷惑,它可以读取和写入许多不同文件类型的元数据,而不仅仅是 EXIF 数据 - 从图像、音频和视频格式到文档(例如 docx 和 microsoft office 格式) xls、开放办公格式、PDF 等。
有关详细信息,请参阅手册页。
如果您仍然想编写自己的而不是使用exiftool
,请继续阅读:
我建议用于perl
这样的任务,因为它有几个库模块可以从各种文件格式读取(和写入)元数据。
图像::Exif工具就是这样一个图书馆。它过去是,现在仍然是为了支持该exiftool
程序和想要编写自己的专用工具的人们而开发的。
如果您使用的是Debian ,Image::Exiftool
则可以使用exiftool
.sudo apt-get install libimage-exiftool-perl
几乎可以肯定它已被打包用于其他发行版(例如在 Centos 上,该包称为perl-Image-ExifTool
)。
虽然我建议这样做是Image::Exiftool
因为它可以处理许多不同类型的文件(因此您可以从学习它的努力中获得最大的收益),但它并不是唯一的 Perl 库。还有很多其他的,包括MP4::信息和音频::扫描。这两个在 debianlibmp4-info-perl
上打包libaudio-scan-perl
。
Perl 还可以创建目录和重命名文件等,并且与 shell 不同,在文件名和变量中不会出现任何引用、空格或 shell 元字符的问题。您已经在 shell 和 awk 代码中遇到过其中一些问题,对于媒体文件常见的长文件名和其中的元数据来说,这将是一个非常严重的问题。这将是一个很多perl
比在 shell 或 中编写它更容易awk
,并且用 shell 以外的任何语言编写它更不容易出错。
perl
,就像 一样awk
,被编写为 UNIX 环境的一部分 - 它通常被称为“瑞士军链锯”,将所有常用 UNIX 工具(grep
、sed
、tr
、awk
、cut
等)的功能组合到一种语言中。
如果您对类似 C 的语法有基本的了解,perl 就很容易学习,它具有混合过程和可选的面向对象编程风格。 立即学习 Perl是一个很好的起点,其中有大量有关 Perl 的信息以及大多数重要的 Perl 相关站点的链接。他们的“Perl 新手”在线教程非常好。
你在 Perl 中学到的大部分内容都可以在awk
(在 awk 的“CONDITION {ACTION}”规则样式的上下文中,该语言也类似于 C)以及grep
and sed
(与 sed 中相同,常规表达式是 Perl 中的 + 和 - 等运算符,而不是函数调用,而不是s/search/replace/
,re.sub(search,replace,string)
和其他 Unix 工具。
Python 也是一个不错的选择,因为它也有用于处理文件中元数据的库模块,但在我看来,它更适合编写“应用程序”而不是命令行“工具”。面向对象的编程风格几乎是强制性的,并且(与除 Fortran 之外的几乎所有其他语言不同)空格和缩进既不灵活又在语法上很重要(即,如果缩进不正确,代码的行为会有所不同,从而很难发现某些类型的错误)。除了一般的编程原则和实践之外,您从 python 中学到的东西不太可能立即与其他 UNIX 工具重用。
答案2
您可以使用sub()
函数从每行的开头删除不需要的部分:
for file in ./*.m4a; do
tageditor get artist -f "$file" | awk 'sub(/^Artist */, "")'
done
我还认为命令的输出tageditor
是制表符分隔的输出;如果是这样,您可以将 awk 的默认空白(制表符/SPC)分隔符限制为制表符,然后打印它的第二列:
for file in ./*.m4a; do
tageditor get artist -f "$file" | awk -F'\t' '/^Artist/{ print $2 }'
done
我还发现该tageditor
命令可以自行读取多个文件,因此您也可以执行以下操作。
tageditor get artist -f /path/to/*.m4a | awk -F'\t' '/^Artist/{ print $2 }'
答案3
这就是你想要做的(用我没有的cat file
地方来代替)?tageditor...
$ cat file | awk 'sub(/^Artist[[:space:]]+/,""){sub(/,.*/,""); print}'
Periphery
Meshuggah
Varials
Cannibal Corpse
Lamb of God
Ingested
Linkin Park
Car Bomb
Whitechapel
Divine Destruction
Ingested
不要使用/Artist/
unanchored,因为它将匹配行中的任何位置,而不仅仅是Artist
第一个字符串的时间:
$ printf 'Foo\tBob The Artist\nArtist\tLamb of God\nArtistically\tIs how we do it\n'
Foo Bob The Artist
Artist Lamb of God
Artistically Is how we do it
$ printf 'Foo\tBob The Artist\nArtist\tLamb of God\nArtistically\tIs how we do it\n' |
awk '/Artist/'
Foo Bob The Artist
Artist Lamb of God
Artistically Is how we do it
$ printf 'Foo\tBob The Artist\nArtist\tLamb of God\nArtistically\tIs how we do it\n' |
awk '/^Artist[[:space:]]/'
Artist Lamb of God
答案4
您可以排除第 1 列
for file in *.m4a; do
tageditor get artist -f "$file" | awk '/Artist/{$1=""}1'
done