在文件名bash中查找字符

时间:2015-04-10 22:39:30

标签: bash

我有一堆文件,其名称格式为:

artist name - song name.mp3

我正在编写一个bash脚本,它将提取艺术家和歌曲名称,并将该文件放在名为"艺术家名称"的目录中。文件名只是"歌名.mp3"。

我如何找到" - "所以我可以将艺术家和歌曲名称解析为适当的变量。另外,我如何查看某个"艺术家姓名"已经有一个目录,然后将该新文件放入该目录?

1 个答案:

答案 0 :(得分:3)

我相信这可以做你想要的:

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

如何运作

  • for f in *.mp3; do

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

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

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

    这使用三个字符space-dash-space作为艺术家和歌曲之间的分隔符。

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

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

    man bash在“参数扩展”标题下记录了后缀删除和前缀删除。

  • mkdir -p "$artist"

    这可以确保有一个为艺术家命名的目录。

  • mv "$f" "$artist/$song"

    这会将mp3文件移动到目录

  • done

    这表示循环结束。