![将文件中的参数逐行传递给函数](https://linux22.com/image/1204458/%E5%B0%86%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E5%8F%82%E6%95%B0%E9%80%90%E8%A1%8C%E4%BC%A0%E9%80%92%E7%BB%99%E5%87%BD%E6%95%B0.png)
我有一些 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'
现在,这将生成一个长列表,每个文件一行,但您想要一个包含总计数的漂亮统计数据。我们可以先对列表进行排序(使用自然数排序模式),然后计算每个唯一行出现的频率。用于此目的的工具是sort
和uniq
:
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