在文件名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文件上启动一个循环用于*.mp3中的f;执行
这将提取艺术家的姓名并将其保存在shell变量artist=${f%%-*};歌曲=${f#*-}
中,提取歌曲的姓名并将其保存在shell变量artist
中 这将使用三个字符的空格作为艺术家和歌曲之间的分隔符song
是后缀删除的一个示例。shell查找${f%%-*}
的最长模式(glob),并将其从变量-*
的末尾删除f
是前缀删除的一个示例。shell为${f#*-}
查找最短模式(glob),并将其从变量*-
的开头删除 后缀删除和前缀删除都记录在“参数扩展”标题下的f
中manbash
这确保存在一个以艺术家命名的目录mkdir-p“$artist”
这会将mp3文件移动到目录中mv“$f”“$artist/$song”
这表示循环结束done
$artist
应该是$song
@Barmar-Fixed。谢谢。你能提供一个链接到${…}
模式的文档吗?@user3439894和das-g,这些都在manbash
中有文档记录。我已经更新了答案,对这两个问题进行了一些讨论。@John1024,我只是快速搜索了manbash
,并浏览了相关部分,谢谢,现在我对如何使用它有了更好的理解+1 :)