将参数从文件逐行传递给函数

mk1*_*024 4 command-line bash scripts

我有一些mp3的列表:

song 1.mp3
song 2.mp3
.
.
.
song 349.mp3
Run Code Online (Sandbox Code Playgroud)

我可以通过鼠标右键查看它们的比特率-> Properties -> Audio/Video,但我也可以使用终端命令检查它

file "song 1.mp3"
Run Code Online (Sandbox Code Playgroud)

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

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

file "song 1.mp3"; file "song 2.mp3"; ... ; file "song 349.mp3"
Run Code Online (Sandbox Code Playgroud)

所以,我的问题是:

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

ste*_*ver 9

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

xargs -d '\n' file < filelist.txt
Run Code Online (Sandbox Code Playgroud)

如果您更喜欢使用 shell 函数

while IFS= read -r f; do [[ -z "$f" ]] || file "$f"; done < filelist.txt
Run Code Online (Sandbox Code Playgroud)


Byt*_*der 5

您可以使用 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
Run Code Online (Sandbox Code Playgroud)

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

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

file *.mp3 | grep -Po '\d+\s+kbps'
Run Code Online (Sandbox Code Playgroud)

现在这会生成一个很长的列表,每个文件一行,但您想要一个很好的统计数据。我们可以通过首先对列表进行排序(使用自然数排序模式)然后计算每个唯一行出现的频率来实现。用于此的工具是sortuniq

file *.mp3 | grep -Po '\d+\s+kbps' | sort -n | uniq -c
Run Code Online (Sandbox Code Playgroud)

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

 16 32 kbps
 18 56 kbps
 67 128 kbps
  3 192 kbps
  6 256 kbps
 38 320 kbps
Run Code Online (Sandbox Code Playgroud)