在文件名bash中查找字符

在文件名bash中查找字符,bash,Bash,我有一堆文件,其名称的格式如下: artist name - song name.mp3 我正在编写一个bash脚本,它将提取艺术家和歌曲名称,并将该文件放在名为“艺术家名称”的目录中,文件名仅为“song name.mp3” 如何找到“-”,以便将艺术家和歌曲名称解析为相应的变量。另外,我如何检查某个“艺术家名称”是否已经有一个目录,然后将该新文件放入该目录?我相信这正是您想要的: for f in *.mp3; do artist=${f%% - *}; song=${f#* - }; m

我有一堆文件,其名称的格式如下:

artist name - song name.mp3
我正在编写一个bash脚本,它将提取艺术家和歌曲名称,并将该文件放在名为“艺术家名称”的目录中,文件名仅为“song name.mp3”


如何找到“-”,以便将艺术家和歌曲名称解析为相应的变量。另外,我如何检查某个“艺术家名称”是否已经有一个目录,然后将该新文件放入该目录?

我相信这正是您想要的:

for f in *.mp3; do artist=${f%% - *}; song=${f#* - }; mkdir -p "$artist"; mv "$f" "$artist/$song"; done
或者,如果要用脚本编写:

for f in *.mp3; do 
    artist=${f%% - *}
    song=${f#* - }
    mkdir -p "$artist"
    mv "$f" "$artist/$song"
done
工作原理
  • 用于*.mp3中的f;执行

    这将在当前目录中的每个mp3文件上启动一个循环

  • artist=${f%%-*};歌曲=${f#*-}

    这将提取艺术家的姓名并将其保存在shell变量
    artist
    中,提取歌曲的姓名并将其保存在shell变量
    song

    这将使用三个字符的空格作为艺术家和歌曲之间的分隔符

    ${f%%-*}
    是后缀删除的一个示例。shell查找
    -*
    的最长模式(glob),并将其从变量
    f
    的末尾删除

    ${f#*-}
    是前缀删除的一个示例。shell为
    *-
    查找最短模式(glob),并将其从变量
    f
    的开头删除

    后缀删除和前缀删除都记录在“参数扩展”标题下的
    manbash

  • mkdir-p“$artist”

    这确保存在一个以艺术家命名的目录

  • mv“$f”“$artist/$song”

    这会将mp3文件移动到目录中

  • done

    这表示循环结束


最后一个
$artist
应该是
$song
@Barmar-Fixed。谢谢。你能提供一个链接到
${…}
模式的文档吗?@user3439894和das-g,这些都在
manbash
中有文档记录。我已经更新了答案,对这两个问题进行了一些讨论。@John1024,我只是快速搜索了
manbash
,并浏览了相关部分,谢谢,现在我对如何使用它有了更好的理解+1 :)