1

所以我有一个作业问题,要求我在一个目录中搜索所有 .mp3 文件,这些文件的命名约定类似于:

Beatles - Lucy in the Sky with Diamonds.mp3

然后,我需要将其置于类似于以下的格式:

Beatles/Lucy in the Sky with Diamonds.mp3

我对 UNIX 很陌生,但我对基本概念有很好的掌握。

我知道如何“剥离”文件名的扩展名(所以“披头士乐队 - 带钻石的天空中的露西”会留下)。

我也知道如何搜索目录中的所有文件。

但是,我不熟悉如何搜索“-”。

我知道在 C++ 等中我可以搜索特定的 char ("-") 并获取该 int 并创建子字符串,但我不知道 UNIX 中的任何此类函数。

我不是在寻找完整的代码来完全回答这个问题,但我想知道如何搜索字符和编辑文件名。

谢谢。

编辑:

使用 nosid 所说的,我设法让文件名在艺术家和歌曲标题之间分开,如下所示:

artist="${originalFile%% - *}"
song="${originalFile#* - }" 

因此该部分可以工作并将它们分开,但是当我尝试移动文件时会出现一个新问题。我有 2 个 if 语句来检测目录是否存在,如果不存在,它将创建该目录。但是,如果我使用艺术家变量作为目录名称,它将创建 2 个目录。使用歌曲也是如此。

所以本质上,当我尝试类似于此的 mkdir 或 mv 时,我怎样才能拥有它以便在文件/目录名称中忽略空格:

mkdir ${artist};
mv ${artist}/${song};
4

3 回答 3

2

您可以使用参数扩展和删除所有最长匹配后缀%%#最短匹配前缀:

source="Beatles - Lucy in the Sky with Diamonds.mp3"
target="${source%% - *}/${source#* - }"

您还可以使用模式替换

source="Beatles - Lucy in the Sky with Diamonds.mp3"
target="${source/ - //}"
于 2013-10-04T22:44:49.060 回答
1

要识别文件,请遍历通配符匹配。

for file in *\ -\ *.mp3; do
    artist="${file%% - *}"
    song="${file#* -  }"
    :
done

循环的主体与@nosid 的答案基本相同。您可能需要在参数替换中摆弄空格,具体取决于您的 shell。(例如,可能是旧版本 Bash 的反斜杠。)

于 2013-10-05T10:17:48.803 回答
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 in the Sky with Diamonds.mp3”(带有前导空格)也是如此。这两个gsub命令删除这些空格并print在它们之间用“/”打印它们。

于 2013-10-04T23:01:54.000 回答