Linux Bash脚本按比特率对mp3文件进行排序

Linux Bash脚本按比特率对mp3文件进行排序,linux,bash,Linux,Bash,我已经拿了这个剧本 它最初似乎工作得很好,并将其修改为这一个,以列出低于320 kbps的曲目,但我得到了一个意外的文件结束错误。 不过,单靠命令似乎效果不错 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 kbps的曲目,但我得到了一个意外的文件结束错误。 不过,单靠命令似乎效果不错

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
有人能指出我错在哪里吗

编辑:

这就是我得到的

~/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
好的,我已将第二行更改为:

bitrate=`mp3info -r a -p "%r\n" "$curfname"`;\
因此不需要awk,因为这会导致问题。 但是现在我比较了float和integer,用

if [ $(echo "$bitrate < 320" | bc ) -e 1 ]
if[$(echo“$比特率<320”| bc)-e1]
返回:第2行:[:-e:应为二进制运算符

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

echo“234.544444试试:

样本输出
$mp3info-ra-p“%f具有%r比特率/”/*.[Mm][Pp]3 | awk-v RS=/'$(NF-1)是的!我找到了一个解决方案

#!/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

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

我还需要按比特率对mp3进行排序,但我还需要将其复制到另一个目录中,并且我希望保留我的“Musique”文件夹的原始结构。所以我这样做了。当然不完美,但它工作正常;)

!/bin/bash
##该脚本搜索具有高比特率(等于320)的mp3并将其复制到另一个目录
##并保持原始文件结构
mp3_path=“/home/user/Musique/”
复制路径=“/media/disk/”
读取文件名时
做
f=$FILENAME
路径=${f%/*}
xfile=${f##*/}
title=${xfile%.*}
ext=${xfile##*.}
目录=$(目录名“${FILENAME}”)
比特率=“$(mp3info-r m-p”%r\n“${FILENAME}”)
#从完整路径中剪切“/home/user/Musique/”以不重新创建它
路径\到\创建=$(echo${directory:19})
复制路径到创建=$(回显“$复制路径$路径到创建”)
如果[[“$bitrate”-等式'320']];则
echo“$bitrate-$FILENAME”>>/home/user/Musique/texte.txt
mkdir-p“$copy\u path\u to\u create”
cp“$FILENAME”“$copy\u path\u to\u create”
fi

完成<如果您将
mp3info
的输出添加到您的问题中,我们将更好地了解如何解析它。如果您告诉我们您的脚本以何种方式没有做您想要的事情(错误输出?没有输出?核心转储?错误消息?其他内容?),我们将更好地了解如何解释和修复它。Shellcheck为您的代码生成代码。您应该在继续之前修复它们。@jww您是否检查了答案或问题中的代码?哦,是的,您运行了旧代码。我的答案中的最后一个似乎很好。否?如果我替换您的行,我得到:~/bin/mp3bitrate.sh~/Music/home/apaxio/bin/mp3bitrate.sh:第3行:NF-1:未找到命令/home/apaxio/bin/mp3bitrate.sh:第3行:320`;\if[$bitrate-lt 320];\then\echo$curfname具有$bitrate比特率;\fi:没有这样的文件或directory@RKon我显示的命令应该是您的完整解决方案。除了我显示的以外,不应该有
if
echo
语句或任何其他语句。噢,它本身什么也不返回?它将如何递归到m的文件夹中usic library抱歉,我无法理解。在您的原始代码中,您有
-maxdepth 1
。这意味着您明确不想要递归。如果您确实想要递归,那么我们需要进行更改。非常感谢!但我得到以下信息:find:当前目录包含在PATH环境变量中,这在组合中是不安全的使用find的-execdir操作删除。请从$PATH中删除当前目录(即删除“.”、双冒号或前导或尾随冒号)危险是什么?关于我的回答,你知道什么命令会移动所有这些找到的文件
mkdir-p missing/path/elems
将创建创建指定路径所需的任何子目录。祝你好运。是的!更近一步,我现在必须从$curfname中删除文件名,我会很好!
mp3info -r a -p "%f has %r bitrate/" ./*.[Mm][Pp]3 | awk -v RS=/ '$(NF-1)<320'
find . -iname '*.mp3' -execdir mp3info -r a -p "%f has %r bitrate/" {} +  | awk -v RS=/ '$(NF-1)<320'
find . -iname '*.mp3' -exec mp3info -r a -p "%f has %r bitrate/" {} +  | awk -v RS=/ '$(NF-1)<320'
$ 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
...
#!/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
...
      then \
         location="${curfname:2}";\
         mv "$curfname" "lowbitrate/$location";\
         echo $curfname has $bitrate bitrate;\
...
#!/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")