将文件中的参数逐行传递给函数

将文件中的参数逐行传递给函数

我有一些 mp3 的列表:

song 1.mp3
song 2.mp3
.
.
.
song 349.mp3

我可以通过以下方式查看他们的比特率鼠标右键->属性->音频/视频,但我也可以检查使用终端命令

file "song 1.mp3"

我想要找出我的列表中最常用的比特率,所以我认为可以通过 shell 即 shell 脚本很好地完成。

如果我打字的话我会浪费太多时间

file "song 1.mp3"; file "song 2.mp3"; ... ; file "song 349.mp3"

所以,我的问题是:

我们可以将参数逐行从文本文件传递给 shell 函数吗?另一个问题是我的歌曲名称包含空格。

答案1

假设您的文件列表每行一个文件名,xargs如果您指定换行符作为分隔符,该实用程序应该能够处理带有空格的文件名,例如

xargs -d '\n' file < filelist.txt

如果你更喜欢使用 shell 函数

while IFS= read -r f; do [[ -z "$f" ]] || file "$f"; done < filelist.txt

答案2

您可以使用 shell glob 来*.mp3选择当前目录中以 结尾的所有文件.mp3。这也会自动处理空格和其他特殊字符。

在我测试的 mp3 上,我得到了如下输出file

01 - Mystery Of A Blood Red Rose.mp3:         Audio file with ID3 version 2.3.0, contains: MPEG ADTS, layer III, v1,  56 kbps, 44.1 kHz, Stereo

您说您对比特率感兴趣,即56 kbps此处。我们可以使用正则表达式(例如(一个或多个数字,后跟一个或多个空格,后跟字符串“kbps”))grep仅提取输出的这一部分。'\d+\s+kbps'

到目前为止,您可以使用它来仅显示当前目录中所有 mp3 文件的比特率信息:

file *.mp3 | grep -Po '\d+\s+kbps'

现在,这将生成一个长列表,每个文件一行,但您想要一个包含总计数的漂亮统计数据。我们可以先对列表进行排序(使用自然数排序模式),然后计算每个唯一行出现的频率。用于此目的的工具是sortuniq

file *.mp3 | grep -Po '\d+\s+kbps' | sort -n | uniq -c

在我的某个音乐文件夹中,输出如下所示。第一个数字是文件数,第二个数字是比特率:

 16 32 kbps
 18 56 kbps
 67 128 kbps
  3 192 kbps
  6 256 kbps
 38 320 kbps

相关内容