所以我的分配有问题,要求我在目录中搜索所有.mp3文件,这些文件的命名约定类似于:
Beatles - Lucy in the Sky with Diamonds.mp3
然后,我需要将其格式化为:
Beatles/Lucy in the Sky with Diamonds.mp3
我对UNIX很陌生,但我对基本概念有很好的把握。
我知道如何“剥离”文件名的扩展名(因此“披头士乐队 - 天空中的露茜与钻石”将被遗忘)。
我也知道如何搜索目录中的所有文件。
但是,我不熟悉如何搜索“ - ”。
我知道在C ++等中我可以搜索特定的字符(“ - ”)并获取该字符串并创建子字符串但我不知道UNIX中的任何此类函数。
我不是在寻找完整的代码来完全回答这个问题,但我想知道如何搜索字符并编辑文件名。
感谢。
编辑:
使用nosid所说的,我设法将文件名分成艺术家和歌曲标题,如下所示:
artist="${originalFile%% - *}"
song="${originalFile#* - }"
因此该部分可以工作并将它们分开,但是当我尝试移动文件时会出现一个新问题。我有2个if语句检测目录是否存在,如果不存在,它将创建该目录。但是,如果我使用artist变量作为目录名,它将创建2个目录。使用这首歌也是如此。
基本上,当我尝试mkdir或类似于mv的mv时,我怎么能拥有它以便在文件/目录名中忽略空格:
mkdir ${artist};
mv ${artist}/${song};
答案 0 :(得分:2)
您可以使用参数扩展与%%
和#
删除最长匹配后缀和最短匹配前缀的所有内容:
source="Beatles - Lucy in the Sky with Diamonds.mp3"
target="${source%% - *}/${source#* - }"
您还可以使用模式替换:
source="Beatles - Lucy in the Sky with Diamonds.mp3"
target="${source/ - //}"
答案 1 :(得分:0)
一种方法是使用awk
程序:
$echo "Beatles - Lucy in the Sky with Diamonds.mp3" |
awk -F- '{
gsub(/ *$/, "", $1);
gsub(/^ */, "", $2);
print $1 "/" $2}'
此输出
Beatles/Lucy in the Sky with Diamonds.mp3
-F-
选项拆分“ - ”字符上的字段,因此$1
是“Beatles”(带有尾随空格),而$2
是“带钻石的天空中的Lucy”。 mp3“(带领先空间)。两个gsub
命令删除了这些空格,print
打印出它们之间的“/”。
答案 2 :(得分:0)
要识别文件,请循环通配符匹配。
for file in *\ -\ *.mp3; do
artist="${file%% - *}"
song="${file#* - }"
:
done
循环体与@nosid的答案基本相同。您可能需要在参数替换中使用空格,具体取决于您的shell。 (例如,也许反斜杠旧版Bash的空格。)