Linux 将相册(FLAC格式歌曲)的总长度添加到每个文件夹的名称中

Linux 将相册(FLAC格式歌曲)的总长度添加到每个文件夹的名称中,linux,bash,flac,Linux,Bash,Flac,谢谢你接受我:) 我正在做一个项目,订购我收藏的很多专辑,我正在按照它们的完整长度对专辑进行分类,目前我正在手动进行分类,但这相当繁琐。我想看看是否有可能在linux中创建一个脚本,允许您浏览每个文件夹,确定相册的总持续时间,然后将该持续时间添加到文件夹名称的最后部分 我的专辑的总体结构如下: Album1 >|Disk1 >SONG1.FLAC >SONG2.FLAC >SONG3.FLAC >|Disk2

谢谢你接受我:)

我正在做一个项目,订购我收藏的很多专辑,我正在按照它们的完整长度对专辑进行分类,目前我正在手动进行分类,但这相当繁琐。我想看看是否有可能在linux中创建一个脚本,允许您浏览每个文件夹,确定相册的总持续时间,然后将该持续时间添加到文件夹名称的最后部分

我的专辑的总体结构如下:

Album1
   >|Disk1
       >SONG1.FLAC
       >SONG2.FLAC
       >SONG3.FLAC
   >|Disk2
       >SONG1.FLAC
       >SONG2.FLAC
       >SONG3.FLAC

 Album2
   >|Disk1
       >SONG1.FLAC
       >SONG2.FLAC
       >SONG3.FLAC
   >|Disk2
       >SONG1.FLAC
       >SONG2.FLAC
       >SONG3.FLAC
我的想法是,脚本确定Album1和Album2以及同一文件夹中所有相册的总持续时间,如果可能的话,也确定持续时间,使用此格式[分钟:秒]将其添加为相册名称,例如:

Album1[minutes:second]
Album2[minutes:second]
 exiftool *.flac | grep -E '^Duration'
Duration                        : 0:00:56
Duration                        : 0:05:27
Duration                        : 0:03:50
Duration                        : 0:05:06
Duration                        : 0:03:48
Duration                        : 0:00:41
Duration                        : 0:08:18
Duration                        : 0:04:02
Duration                        : 0:16:20
Duration                        : 0:06:59
Duration                        : 0:06:02
Duration                        : 0:03:51
Duration                        : 0:05:05
Duration                        : 0:16:53
Duration                        : 27.01 s
Duration                        : 0:04:20
Duration                        : 0:03:29
Duration                        : 0:07:14
total=0
for file in "/your/flac/directory"/*.flac; do
    length=$( mediainfo --Inform="Audio;%Duration%" "$file" )
    (( total += length ))
done
(( total /= 1000 )) # from milliseconds to seconds
echo "Total: $total seconds"
date -u -d "@$total" +%H:%M:%S
如果相册的持续时间超过一小时,则可以将其转换为分钟,例如: 1小时:36分钟:13秒>>>>96分13秒

我希望你能帮我一点忙:)


谢谢

这是一个需要在系统上安装
bash
exiftool
的解决方案:

#/usr/bin/env bash
设置-euo管道故障
#迭代包含flac文件的所有目录
找到-输入f-name'*.flac'-print0 | xargs-0-L1 dirname-z | xargs-0-L1 dirname | sort-u |而read-r相册;做
#在每个目录中,迭代所有flac文件
#并累积持续时间以生成最终专辑名称
NEW_NAME=“$(查找“$ALBUM”-键入f-NAME'*.flac'|同时读取-r flac;do
#使用exiftool确定音频的持续时间
exiftool“$FLAC”| grep-E“^Duration”| sed-E的#^.*:###'| tr':''
完成| awk-v ALBUM=“$ALBUM”
{总分钟数+=$1*60}累计小时数
{total_minutes+=$2}#累计分钟数
{total_seconds+=$3}累计秒数
结束{
总分钟数+=int(总秒数/60)
总秒数=总秒数%60
打印文件“%s[%d:%d]”,相册,总分钟,总秒
}
')"
echo mv“$ALBUM”“$NEW_NAME”
完成
简要说明:它递归查找当前目录中的所有flac文件,按其父目录(即不是磁盘而是相册目录)对它们进行分组,然后迭代所有相册目录。对于每个相册目录,它使用awk累积在该目录中找到的所有flac文件的持续时间。awk还用于构建相册的新名称

给定的解决方案仅响应mv。如果您对结果满意,请删除
echo
,只保留
mv…


请注意,虽然脚本在本地为我工作,但您的文件结构中可能存在边缘情况。我建议您先进行备份。

以下是一个需要在系统上安装
bash
exiftool
的解决方案:

#/usr/bin/env bash
设置-euo管道故障
#迭代包含flac文件的所有目录
找到-输入f-name'*.flac'-print0 | xargs-0-L1 dirname-z | xargs-0-L1 dirname | sort-u |而read-r相册;做
#在每个目录中,迭代所有flac文件
#并累积持续时间以生成最终专辑名称
NEW_NAME=“$(查找“$ALBUM”-键入f-NAME'*.flac'|同时读取-r flac;do
#使用exiftool确定音频的持续时间
exiftool“$FLAC”| grep-E“^Duration”| sed-E的#^.*:###'| tr':''
完成| awk-v ALBUM=“$ALBUM”
{总分钟数+=$1*60}累计小时数
{total_minutes+=$2}#累计分钟数
{total_seconds+=$3}累计秒数
结束{
总分钟数+=int(总秒数/60)
总秒数=总秒数%60
打印文件“%s[%d:%d]”,相册,总分钟,总秒
}
')"
echo mv“$ALBUM”“$NEW_NAME”
完成
简要说明:它递归查找当前目录中的所有flac文件,按其父目录(即不是磁盘而是相册目录)对它们进行分组,然后迭代所有相册目录。对于每个相册目录,它使用awk累积在该目录中找到的所有flac文件的持续时间。awk还用于构建相册的新名称

给定的解决方案仅响应mv。如果您对结果满意,请删除
echo
,只保留
mv…


请注意,虽然脚本在本地为我工作,但您的文件结构中可能存在边缘情况。我建议您先做一个备份。

感谢shilch用户,他可以帮助我编写如何在echa相册中添加总长度的脚本,但我做了一些新的修改

#!/bin/bash
#set -euo pipefail
# Iterate over all directories containing flac files
# Iterate over all directories containing flac files
for d in */ ; do
    a=$d
    z="$(basename "$d")"
    cd "$d"
    # In each directory, iterate over all flac files
    # and accumulate the duraction to build the final album name
    NEW_NAME="$(find . -type f -name '*.flac' | while read -r FLAC; do
        # Determine duration of audio using the exiftool
        exiftool "$FLAC" | grep -E '^Duration' | sed -E 's#^.*: ##' | tr ':' ' '
    done | awk -v ALBUM="$ALBUM" '
    { total_minutes += $1 * 60 } # Accumulate hours
    { total_minutes += $2 }      # Accumulate minutes
    { total_seconds += $3 }      # Accumulate seconds
    END {
        total_minutes += int(total_seconds / 60)
        total_seconds = total_seconds % 60
        printf "%s[%d:%d]", ALBUM, total_minutes, total_seconds
    }
    ')"
    #echo "$d"
    cd -
    echo "$z"
    b="$NEW_NAME"
    c=$z$b
    echo "$c"
    echo "$NEW_NAME"
    #echo mv "$ALBUM" "$NEW_NAME"
    mv -- "$z" "$c"
    #mv "$z" "$c"
done
但这有一个问题,当它分析长度小于59秒的歌曲时,它没有正确地添加秒数,并将秒数的值视为分钟,并且计算没有给出确切的值,例如,此专辑有一首仅持续27秒的歌曲,例如:

Album1[minutes:second]
Album2[minutes:second]
 exiftool *.flac | grep -E '^Duration'
Duration                        : 0:00:56
Duration                        : 0:05:27
Duration                        : 0:03:50
Duration                        : 0:05:06
Duration                        : 0:03:48
Duration                        : 0:00:41
Duration                        : 0:08:18
Duration                        : 0:04:02
Duration                        : 0:16:20
Duration                        : 0:06:59
Duration                        : 0:06:02
Duration                        : 0:03:51
Duration                        : 0:05:05
Duration                        : 0:16:53
Duration                        : 27.01 s
Duration                        : 0:04:20
Duration                        : 0:03:29
Duration                        : 0:07:14
total=0
for file in "/your/flac/directory"/*.flac; do
    length=$( mediainfo --Inform="Audio;%Duration%" "$file" )
    (( total += length ))
done
(( total /= 1000 )) # from milliseconds to seconds
echo "Total: $total seconds"
date -u -d "@$total" +%H:%M:%S

在本例中,它仅持续27秒,但不以00格式显示分钟或小时,这是exiftool的问题。我尝试过使用soxi,他们得到了正确的长度,但使用此脚本不起作用。

感谢shilch用户,他可以帮助我了解如何在echa相册中添加总长度,但我做了一些新的修改

#!/bin/bash
#set -euo pipefail
# Iterate over all directories containing flac files
# Iterate over all directories containing flac files
for d in */ ; do
    a=$d
    z="$(basename "$d")"
    cd "$d"
    # In each directory, iterate over all flac files
    # and accumulate the duraction to build the final album name
    NEW_NAME="$(find . -type f -name '*.flac' | while read -r FLAC; do
        # Determine duration of audio using the exiftool
        exiftool "$FLAC" | grep -E '^Duration' | sed -E 's#^.*: ##' | tr ':' ' '
    done | awk -v ALBUM="$ALBUM" '
    { total_minutes += $1 * 60 } # Accumulate hours
    { total_minutes += $2 }      # Accumulate minutes
    { total_seconds += $3 }      # Accumulate seconds
    END {
        total_minutes += int(total_seconds / 60)
        total_seconds = total_seconds % 60
        printf "%s[%d:%d]", ALBUM, total_minutes, total_seconds
    }
    ')"
    #echo "$d"
    cd -
    echo "$z"
    b="$NEW_NAME"
    c=$z$b
    echo "$c"
    echo "$NEW_NAME"
    #echo mv "$ALBUM" "$NEW_NAME"
    mv -- "$z" "$c"
    #mv "$z" "$c"
done
但这有一个问题,当它分析长度小于59秒的歌曲时,它没有正确地添加秒数,并将秒数的值视为分钟,并且计算没有给出确切的值,例如,此专辑有一首仅持续27秒的歌曲,例如:

Album1[minutes:second]
Album2[minutes:second]
 exiftool *.flac | grep -E '^Duration'
Duration                        : 0:00:56
Duration                        : 0:05:27
Duration                        : 0:03:50
Duration                        : 0:05:06
Duration                        : 0:03:48
Duration                        : 0:00:41
Duration                        : 0:08:18
Duration                        : 0:04:02
Duration                        : 0:16:20
Duration                        : 0:06:59
Duration                        : 0:06:02
Duration                        : 0:03:51
Duration                        : 0:05:05
Duration                        : 0:16:53
Duration                        : 27.01 s
Duration                        : 0:04:20
Duration                        : 0:03:29
Duration                        : 0:07:14
total=0
for file in "/your/flac/directory"/*.flac; do
    length=$( mediainfo --Inform="Audio;%Duration%" "$file" )
    (( total += length ))
done
(( total /= 1000 )) # from milliseconds to seconds
echo "Total: $total seconds"
date -u -d "@$total" +%H:%M:%S

在本例中,它仅持续27秒,但不以00格式显示分钟或小时,这是exiftool的问题。我尝试使用soxi,他们得到了正确的长度,但使用此脚本不起作用。

您可以在se中获得单独的持续时间