使用 bash 列出比特率超过 320 kbps 的所有 mp3 文件

使用 bash 列出比特率超过 320 kbps 的所有 mp3 文件

我想获取比特率 >320 的所有 mp3 文件的列表。我不确定如何将正则表达式应用于 exiftool -AudioBitrate 命令的输出。

find . -type f -name '*.mp3' -print0 | while IFS= read -r -d '' i; do
   BITRATE=echo $(exiftool -AudioBitrate "$i")| grep -q '#([0-9]+) kbps#';
   if $BITRATE > 320
      then echo $BITRATE "$i"
   fi
done

答案1

这是一个有效的 bash 脚本。基本上就是经过一些调整后得到的:

#!/bin/bash
set -o pipefail

find . -type f -name "*.mp3" -print0 | while IFS= read -r -d '' file; do
    BITRATE=$(exiftool -AudioBitrate "$file" | grep -Eo '[0-9]+ kbps' | sed 's/ kbps//')
    if [[ $? -eq 0 ]] && [[ $BITRATE -ge 320 ]]; then
        echo $BITRATE "$file"
    fi
done

在设置$BITRATE变量时,我exiftool直接通过管道运行并用于$(...)捕获输出。然后,在条件中,我使用 Bash 的数字比较运算符检查exiftool->管道是否成功以及比特率是否足够高。grep

我已经检查过它是否可以处理.mp3我周围的一些随机文件,包括名称中带有空格的文件。

答案2

不需要所有这些工具...

exiftool -q -if '$AudioBitrate > 320' -p '$AudioBitrate $Directory/$Filename' -ext mp3 -r .

exiftool 在当前目录中递归搜索,仅搜索带扩展名的文件,如果满足mp3条件则打印比特率和文件名$AudioBitrate > 320

答案3

简单又偷懒的方法:

#!/bin/bash

bitrateMin=320
find . -iname '*.mp3' -print0 |
  while IFS= read -r -d '' file; do
    [[ $(exiftool -AudioBitrate "$file" | awk -v br="$bitrateMin" '$4 >= br{print $4}') ]] && printf '%s\n' "$file"
done

相关内容