循环访问顺序访问 exifdata 的歌曲

Posted

技术标签:

【中文标题】循环访问顺序访问 exifdata 的歌曲【英文标题】:loop over songs accessing exifdata sequentially 【发布时间】:2021-12-31 04:52:24 【问题描述】:

以下代码的工作原理是根据它们的 exifdata 将我的松散曲目从 +++ 文件夹排序到相应的 Artist/Loosies 文件夹。它将复制或创建一个文件夹然后复制。

目前,如果我在 +++ 目录中只有一首歌曲,它就可以工作,但只要我添加两首,脚本就会在第一个 exiftool 命令处停止。

*我想使用 bash 来完成这项工作,我意识到可能有一种更简单/更快的方法可以只使用 exiftool 来完成这项工作,但我开始这样做是为了自学 bash 脚本。

#!/usr/bin/env bash
loosies='Loosies'
for song in ~/Music/+++;
do
    artist=`exiftool -r -q -Artist $song` ;
    album=`exiftool -r -q -Album $song` ;
    title=`exiftool -r -q -title $song` ;
    title=$title#*:  ;
    album=$album#*:  ;
    artist=$artist#*:  ;
    if [[ -d  ~/Music/Artists/$artist ]] ;
    then
        if [[ -d  ~/Music/Artists/$artist/$album ]] ; then
            echo ~/Music/Artists/$artist/$album ;
            cp -r $song/. ~/Music/Artists/$artist/$album ;
        else
            mkdir ~/Music/Artists/$artist/$loosies ;
            cp -r $song/. ~/Music/Artists/$artist/$loosies ;
            if [[ -f ~/Music/Artists/$artist/$loosies/$title ]] ; then
                exiftool "$song" -Artist -Album > ~/'success.txt';
            else
                exiftool "$song" -Artist -Album > ~/'fail.txt';
            fi
        fi
    else
        mkdir ~/Music/Artists/$artist ;
        mkdir ~/Music/Artists/$artist/$loosies ;
        cp -r~/Music/Artists/$artist/$loosies ;
        if [[ -f ~/Music/Artists/$artist/$album/$title ]] ; then
            exiftool "$song" -Artist -Album > ~/'success.txt';
        else
            exiftool "$song" -Artist -Album > ~/'fail.txt';
        fi
    fi
done

【问题讨论】:

您正在向 exiftool 发送目录,而不是文件。您需要一个全局变量:..Music/+++/*。删除-r - 它是递归的,对一次处理一个文件没有帮助。 exiftool 不支持写入 mp3(仅读取),所以无论如何你都需要这样做。 感谢@dan 的回答,这一切都说得通。删除了递归 -r 并一直在修补 glob,似乎无法使其正常工作。我应该将它添加到我的 for 循环还是 exif 命令本身?在 for 循环中使用~/Music/+++/*,它会正确打印,但是当我在前面添加 .. 时会不断出错,或者尝试在输出上使用 exiftool。 【参考方案1】:

在@dan 的帮助下能够搞定这一切 现在可以搜索艺术家“Loosies”文件夹,如果不存在则创建一个。 然后将文件复制到那里。 最后检查文件是否确实存在并打印到失败/成功文本文件。

#!/usr/bin/env bash
for song in ~/Music/+++/*;
do
    artist=`exiftool -Artist "$song"`;
    title=`exiftool -title "$song"`;
    title=$title#*:  ;
    artist=$artist#*:  ;
    if [[ -d  ~/Music/Artists/"$artist" ]] ;
    then
        if [[ -d  ~/Music/Artists/"$artist"/Loosies ]] ; then
            cp  "$song" ~/Music/Artists/"$artist"/Loosies ;
        else
            mkdir -p ~/Music/Artists/"$artist"/Loosies ;
            cp  "$song" ~/Music/Artists/"$artist"/Loosies ;
        fi
    else
        mkdir -p ~/Music/Artists/"$artist"/Loosies ;
        cp "$song" ~/Music/Artists/"$artist"/Loosies ;
    fi
    song_=$song##*/
    if [[ -f ~/Music/Artists/$artist/Loosies/$song_ ]] ; then
        exiftool "$song" -Album -Artist -title >> ~/'success.txt';
        echo '---' >> ~/'success.txt';
    else
        exiftool "$song" -Album -Artist -title >> ~/'fail.txt';
        echo '---' >> ~/'fail.txt';
    fi
done

【讨论】:

以上是关于循环访问顺序访问 exifdata 的歌曲的主要内容,如果未能解决你的问题,请参考以下文章

其实C语言就是三种结构吧?顺序结构、选择结构、循环结构?

歌曲播放的随机算法的探讨

在 For-Next 循环 vba 期间按顺序显示控件

STL 啥是随机访问和顺序访问?

序列容器-元素只能按顺序访问

源顺序对可访问性有啥影响?源顺序重要吗?