我已经采取了这个脚本https://www.linuxquestions.org/questions/linux-newbie-8/finding-corrupt-mp3s-in-library-632053/,这似乎工作得很好,并将其修改为这一个,列出了低于320kbps的轨道,但我得到一个意外的文件结束错误。不过,命令本身似乎可以很好地工作。
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了,因为这会导致问题。但是现在我比较了一个浮点数和一个整数,用
if [ $(echo "$bitrate < 320" | bc ) -e 1 ]返回:第2行:[:-e:需要二元运算符
但是单独运行该命令似乎是可行的:
echo "234.54444444<320“| bc
返回1,我想知道到底出了什么问题!
发布于 2019-05-19 23:39:21
尝试:
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中它永远不是文件名的一部分。因此,我们可以使用:
mp3info -r a -p "%f has %r bitrate/" ./*.[Mm][Pp]3 | awk -v RS=/ '$(NF-1)<320'样本输出
$ 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
find . -iname '*.mp3' -execdir mp3info -r a -p "%f has %r bitrate/" {} + | awk -v RS=/ '$(NF-1)<320'例如:
$ 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一起使用
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
...发布于 2019-05-20 03:42:18
是!我找到了一个解决方案!
#!/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文件记录到文件中。
我如何才能将这些文件中的每一个文件移动到一个新的目录中,保持原来的结构?因为即使我这么做了:
...
then \
location="${curfname:2}";\
mv "$curfname" "lowbitrate/$location";\
echo $curfname has $bitrate bitrate;\
...我仍然需要递归地mkdirs,有什么想法吗?
发布于 2020-04-11 14:33:52
我还需要按比特率对我的mp3进行排序,但我还需要将它复制到另一个目录中,并且我想保留我的"Musique“文件夹的原始结构。所以我就这么做了。当然不是完美的,但它是有效的;)
#!/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")https://stackoverflow.com/questions/56209192
复制相似问题