通过搜索char来编辑文件名

时间:2013-10-04 22:35:49

标签: bash unix

所以我的分配有问题,要求我在目录中搜索所有.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};

3 个答案:

答案 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的空格。)