查找命令并支持媒体元数据

查找命令并支持媒体元数据

我有一个文件夹,里面有大量各种类型的杂乱文件,还有深层次的子文件夹,我想找到每个 320kpbs(比特率)的音频文件,并在不将它们全部移动到同一位置的情况下对每个文件运行某些操作。例如:

find /some/folder -type f -regextype posix-extended -regex '.*\.(flac|ape|wa?v|m(p3|4a))' -BITRATE_IS_320kbps -exec ... \;

但我不知道有哪个命令行可以为我完成这类任务。

我已经想到了一些不太优雅的方法来实现这一点,但我仍然想知道如何find(可能类似地)通过这样的元数据来处理文件?

答案1

使用@blm 链接答案中的信息,您可以执行以下操作:

find /some/folder -type f -regextype posix-extended -regex '.*\.(flac|ape|wa?v|m(p3|4a))' -exec bash -c " file '{}' | grep '320 kbps'" \; -exec <do what you want>

第一个命令-exec将只查找 320 kbps 的文件,因为file命令会为我们报告这一点。如果grep不匹配任何内容,则结果-exec为 false,第二个命令-exec将不执行。grep但如果匹配,则第二个命令-exec将执行

为了完整性,-exec可以在手册页

-exec command ;  
     Execute command; true if 0 status is returned

编辑:

关于此解决方案中的使用file,它似乎并不适合所有人。因此,这里有一种使用来获取比特率的替代方法mediainfo

#!/bin/bash

bitrate=$(mediainfo "$1" | grep -Ei 'overall bit ?rate.*[[:digit:]]+.*$' | grep -Eo [[:digit:]]+)
echo $bitrate

您可以将其保存为具有执行权限的 .sh 文件,然后它会根据mediainfo整体比特率信息为您提供文件的比特率(仅数字),您可以这样替换

-exec bash -c " file '{}' | grep '320 kbps'" \;

-exec bash -c "BITRATE_SCRIPT_PATH '{}' | grep '320'" \;

(无损音频文件可能表现不佳,无损音频文件的比特率通常为 1Mbps+)

答案2

不确定您如何从 cmd 获取比特率信息,file但我不知道......

$: file 01\ -\ Trolleyed.flac
01 - Trolleyed.flac: FLAC audio bitstream data, 24 bit, stereo, 17842272 samples

$: file 01\ -\ Autumn\ Leaves.mp3
01 - Autumn Leaves.mp3: Audio file with ID3 version 2.4.0

无论如何,受此启发邮政我想出了一个需要外部工具的解决方案(在这种情况下媒体信息)它并不像我希望的那样性感或高性能,但它确实有效。

find . -type f -regextype posix-extended -regex '.*\.(flac|ape|wa?v|m(p3|4a))' -exec sh -c 'for x; do export BITRATE=$(mediainfo --inform="Audio;%BitRate%" "$x"); if [ $BITRATE = 320000 ]; then echo "$x"; fi; done' _ {} +

此处的then语句只是重复了文件名,但实际上可以被其他任何东西替换。

祝大家圣诞快乐。

相关内容