【问题标题】:Editing filenames by searching for a char通过搜索字符来编辑文件名
【发布时间】:2013-10-06 04:26:34
【问题描述】:

所以我有一个作业问题,要求我在一个目录中搜索所有 .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};

【问题讨论】:

  • 谷歌“bash tr”、“bash grep”、“bash awk”、“bash for loops”,您会发现大量有关如何执行此操作的信息。
  • 您必须在变量周围使用引号,即"$artist" 而不是${artist}。请不要编辑问题以询问其他内容。提出一个新问题并首先搜索类似的问题。

标签: bash unix


【解决方案1】:

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

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

你也可以使用模式替换

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

【讨论】:

  • 首先感谢您的及时回复和帮助。我更新了我的问题,因为您提供的方法遇到了一个小问题。你能帮我解决这个问题吗?
【解决方案2】:

要识别文件,循环通配符匹配。

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

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

【讨论】:

    【解决方案3】:

    一种方法是使用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 打印它们并在它们之间加上一个“/”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-11
      • 2014-02-26
      • 2011-10-10
      相关资源
      最近更新 更多