首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于按比特率对mp3文件进行排序的Bash脚本

用于按比特率对mp3文件进行排序的Bash脚本
EN

Stack Overflow用户
提问于 2019-05-19 23:20:18
回答 3查看 368关注 0票数 1

我已经采取了这个脚本https://www.linuxquestions.org/questions/linux-newbie-8/finding-corrupt-mp3s-in-library-632053/,这似乎工作得很好,并将其修改为这一个,列出了低于320kbps的轨道,但我得到一个意外的文件结束错误。不过,命令本身似乎可以很好地工作。

代码语言:javascript
复制
find . -maxdepth 1 -iname '*.mp3' -exec sh -c 'curfname="{}";\
      bitrate=`mp3info -r a -p "%f %r\n" "$curfname" | awk 'NF>1{print $NF}'`;\
      if [ $bitrate -lt 320 ];\
      then \
         echo $curfname has $bitrate bitrate; \
      fi ' \; | tee ./lowbitrate.log

有没有人能指出我哪里错了?

编辑:

这就是我所得到的

代码语言:javascript
复制
~/bin/mp3bitrate.sh ~/Music
}`;\
      if [ $bitrate -lt 320 ];\
      then \
         echo $curfname has $bitrate bitrate; \
      fi : -c: line 1: unexpected EOF while looking for matching ``'
}`;\
      if [ $bitrate -lt 320 ];\
      then \
         echo $curfname has $bitrate bitrate; \
      fi : -c: line 2: syntax error: unexpected end of file
}`;\
      if [ $bitrate -lt 320 ];\
      then \
         echo $curfname has $bitrate bitrate; \
      fi : -c: line 1: unexpected EOF while looking for matching ``'
}`;\
      if [ $bitrate -lt 320 ];\
      then \
         echo $curfname has $bitrate bitrate; \
      fi : -c: line 2: syntax error: unexpected end of file
}`;\
      if [ $bitrate -lt 320 ];\
      then \
         echo $curfname has $bitrate bitrate; \
      fi : -c: line 1: unexpected EOF while looking for matching ``'
}`;\
      if [ $bitrate -lt 320 ];\
      then \
         echo $curfname has $bitrate bitrate; \
      fi : -c: line 2: syntax error: unexpected end of file

好的,我已经用以下命令更改了第二行:

代码语言:javascript
复制
bitrate=`mp3info -r a -p "%r\n" "$curfname"`;\

这样就不需要awk了,因为这会导致问题。但是现在我比较了一个浮点数和一个整数,用

代码语言:javascript
复制
if [ $(echo "$bitrate < 320" | bc ) -e 1 ]

返回:第2行:[:-e:需要二元运算符

但是单独运行该命令似乎是可行的:

echo "234.54444444<320“| bc

返回1,我想知道到底出了什么问题!

EN

回答 3

Stack Overflow用户

发布于 2019-05-19 23:39:21

尝试:

代码语言:javascript
复制
mp3info -r a -p "%f has %r bitrate\n" ./*.[Mm][Pp]3 | awk '$(NF-1)<320'

它的工作原理:

  • -p "%f has %r bitrate\n"以这样的格式打印信息: want.
  • awk '$(NF-1)<320'仅选择那些比特率低于320的行。

改进

如果文件名本身包含换行符,上述操作将失败。解决这个问题的常用方法是使用NUL分隔的输出,但据我所知,mp3info不支持这种方式。在我们的例子中,输出永远不会包含/。这是因为,尽管/可以是路径的一部分,但在%f中它永远不是文件名的一部分。因此,我们可以使用:

代码语言:javascript
复制
mp3info -r a -p "%f has %r bitrate/" ./*.[Mm][Pp]3 | awk -v RS=/ '$(NF-1)<320'

样本输出

代码语言:javascript
复制
$ mp3info -r a -p "%f has %r bitrate/" ./*.[Mm][Pp]3 | awk -v RS=/ '$(NF-1)<320'
gd77-05-08d1t01.mp3 has 186.720474 bitrate
gd77-05-08d1t02.mp3 has 183.336975 bitrate
gd77-05-08d1t03.mp3 has 183.020111 bitrate
...

递归到子目录(安全版本)

要递归遍历currect目录及其所有子目录以查找扩展名为mp3的文件,我们可以使用find。最安全的方法是在-execdir中使用find

代码语言:javascript
复制
find . -iname '*.mp3' -execdir mp3info -r a -p "%f has %r bitrate/" {} +  | awk -v RS=/ '$(NF-1)<320'

例如:

代码语言:javascript
复制
$ find . -iname '*.mp3' -execdir mp3info -r a -p "%f has %r bitrate/" {} +  | awk -v RS=/ '$(NF-1)<320'
gd77-05-08d1t05.mp3 has 184.018967 bitrate
gd77-05-08d3t05.mp3 has 189.467697 bitrate
gd77-05-08d1t08.mp3 has 183.625366 bitrate
gd77-05-08d1t09.mp3 has 183.826721 bitrate
...

递归到子目录(不太安全的版本)

如果您的PATH是“不安全的”,那么可以将find-exec一起使用

代码语言:javascript
复制
find . -iname '*.mp3' -exec mp3info -r a -p "%f has %r bitrate/" {} +  | awk -v RS=/ '$(NF-1)<320'

这将产生相同的输出:

代码语言:javascript
复制
$ find . -iname '*.mp3' -exec mp3info -r a -p "%f has %r bitrate/" {} +  | awk -v RS=/ '$(NF-1)<320'
gd77-05-08d1t05.mp3 has 184.018967 bitrate
gd77-05-08d3t05.mp3 has 189.467697 bitrate
gd77-05-08d1t08.mp3 has 183.625366 bitrate
gd77-05-08d1t09.mp3 has 183.826721 bitrate
...
票数 2
EN

Stack Overflow用户

发布于 2019-05-20 03:42:18

是!我找到了一个解决方案!

代码语言:javascript
复制
#!/bin/bash
#
find . -maxdepth 3 -iname '*.[Mm][Pp]3' -exec sh -c 'curfname="{}";\
      bitrate=`mp3info -r a -p "%r\n" "$curfname"`;\
      if (( $(echo "$bitrate < 320" |bc -l) ));\
      then \
         echo $curfname has $bitrate bitrate; \
      fi ' \; | tee ./lowbitrate.log

将成功扫描递归到深度3的位置,在终端中打印并将发现的比特率低于320Kbps的任何mp3文件记录到文件中。

我如何才能将这些文件中的每一个文件移动到一个新的目录中,保持原来的结构?因为即使我这么做了:

代码语言:javascript
复制
...
      then \
         location="${curfname:2}";\
         mv "$curfname" "lowbitrate/$location";\
         echo $curfname has $bitrate bitrate;\
...

我仍然需要递归地mkdirs,有什么想法吗?

票数 0
EN

Stack Overflow用户

发布于 2020-04-11 14:33:52

我还需要按比特率对我的mp3进行排序,但我还需要将它复制到另一个目录中,并且我想保留我的"Musique“文件夹的原始结构。所以我就这么做了。当然不是完美的,但它是有效的;)

代码语言:javascript
复制
#!/bin/bash
## That script search for mp3 with high bitrate (equal to 320) and copy it to another directory
## and keep the original file structure
mp3_path="/home/user/Musique/"
copy_path="/media/disk/"

while read FILENAME
do

    f=$FILENAME
    path=${f%/*}
    xfile=${f##*/}
    title=${xfile%.*}
    ext=${xfile##*.}
    directory=$(dirname "${FILENAME}")

    bitrate="$(mp3info -r m -p "%r\n" "${FILENAME}")"
    # cut "/home/user/Musique/"" from the full path to not recreate it
    path_to_create=$(echo ${directory:19})
    copy_path_to_create=$(echo "$copy_path$path_to_create")

    if [[ "$bitrate" -eq '320' ]] ; then

        echo "$bitrate - $FILENAME" >> /home/user/Musique/texte.txt
        mkdir -p "$copy_path_to_create"
        cp "$FILENAME" "$copy_path_to_create"
    fi

done < <(find "$mp3_path" -type f -name "*.mp3")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56209192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档