【问题标题】:Output certain file info to text file using files in different folders使用不同文件夹中的文件将某些文件信息输出到文本文件
【发布时间】:2016-10-13 02:33:31
【问题描述】:

我正在使用 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
----

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

【问题讨论】:

    标签: linux bash file shell directory


    【解决方案1】:

    你可以使用查找:

    find . -type f -exec afinfo {} +
    

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

    如果您的目录包含非音频文件,例如。 .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}'
    

    上面将打印比特率

    【讨论】:

    • 太棒了,它可以很好地输出我想要的所有信息,现在我只需要通过一个 IF 语句来过滤掉高于 320 的比特率
    • 对不起,我会把它添加到 OP 中。
    • @andIrc 太棒了!我对您添加的那个命令做了一点改动,这样它就可以输出文件名和比特率,但除此之外,它工作得很好,非常感谢!这是我使用的最后一个命令: find 。 -type f -exec afinfo {} + | awk '/File:/ {$1="";f=$0}/bit rate:/ && $3
    • 一个建议可能是为非音频格式的文件添加一些内容(否则您可能会遇到很多失败的错误)。它们可以被忽略或输出到 dev/null...
    • @l'L'l 感谢您的讨论。我用新信息更新了答案:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    相关资源
    最近更新 更多