使用不同文件夹中的文件将某些文件信息输出到文本文件

时间:2016-06-12 16:51:14

标签: linux bash file shell directory

我正在使用OS X终端,该终端有一个名为' afinfo'的命令。它输出音频文件的信息。在这种情况下,我想要我的歌曲的比特率信息,所以我执行以下操作:

MBP:$ afinfo 01\ Strangers\ To\ Ourselves.aiff | grep "bit rate"
bit rate: 1411200 bits per second

很好,所以我现在知道那首歌的比特率。显然,我可以使用它来获取该目录中每首歌曲的信息:

MBP:$ afinfo * | grep "bit rate"
bit rate: 271000 bits per second
bit rate: 320000 bits per second
bit rate: 248000 bits per second
bit rate: 320000 bits per second
bit rate: 251000 bits per second

我想要做的是编写一个脚本,该脚本只输出比特率低于320000的歌曲名称和比特率的文本文件。现在,如果我只使用此文件夹中的文件,我可以使用grep "File:\|bit rate"并将其放到我的文本文件>> sometext中,但我不确定如何编写if语句,并且我的图书馆是这样组织的:

Music Folder
|
\----- Artist1
       |
       \-------Album1
               |
               \-------song1
               \-------song2
               ...

所以我需要帮助导航所有子文件夹并在所有子文件夹上使用afinfo。我一直在阅读Linux +学习指南(LPIC-1),但还没有完全编写脚本。

任何帮助都将非常感谢!!!

编辑:在一个文件中添加afinfo的完整输出:

MBP:$ afinfo 01\ Lampshades\ On\ Fire.mp3 
File:           01 Lampshades On Fire.mp3
File type ID:   MPG3
Num Tracks:     1
----
Data format:     2 ch,  44100 Hz, '.mp3' (0x00000000) 0 bits/channel, 0 bytes/packet, 1152 frames/packet, 0 bytes/frame
                no channel layout.
estimated duration: 187.768150 sec
audio bytes: 7510726
audio packets: 7188
bit rate: 320000 bits per second
packet size upper bound: 1052
maximum packet size: 1045
audio data file offset: 191565
optimized
----

所以你看,我只对File:和bit rate:这个场景的字符串感兴趣。我正在考虑使用grep将比特率转换为变量,然后以某种方式在我的IF语句中使用它,但我感觉这对我正在尝试做的事情过于复杂......

1 个答案:

答案 0 :(得分:3)

您可以使用find:

find . -type f -exec afinfo {} +

这将找到递归文件并使用尽可能多的文件名调用afinfo,输出将转到stdout。

如果您的目录包含非音频文件的文件,例如。 .DS_Store等您可以过滤已知的文件扩展名:

find . -type f \( -name '*.mp3' -o -name '*.flac' \) -exec afinfo {} +

但是,在指定文件音频文件的情况下,重定向stderrafinfo将输出Fail: AudioFileOpenURL failed时,可能无法知道所有文件扩展名。到/dev/null会抑制错误:

find . -type f -exec afinfo {} + 2> /dev/null | ...    

您现在可以通过管道输入awk来获取具有预期比特率的文件:

... | awk '/File:/ {$1="";f=$0}/bit rate:/ && $3 < 320000{print f}'

以上将打印比特率