4

我正在尝试创建一个循环来创建目录并将文件移动到这些目录中,以便我可以按字母顺序对内容进行排序。这是我所拥有的:

for i in a b c d e f g h i j k l m n o p q r s t u v w x y z
    do
        mkdir $i
        mv -i $i*.* ./$i/
done
ls

问题是mv这个循环中的命令没有捕获大写文件名,我不想为大写和小写文件名创建目录。解决方案是什么?或者,如果您不想直接出来告诉我解决方案,我在哪里可以找到?

我在 google 上查看了一些东西,但没有找到可以使用的解决方案。我对 shell 脚本比较陌生,所以请解释您可能建议的任何解决方案,以便我理解并且以后不必问类似的问题。

4

2 回答 2

7

在 bash 中,您可以使用

shopt -s nocaseglob
于 2013-07-08T00:08:56.783 回答
1

zsh你可以使用zmv. [我无法直接链接到该man页面,但它位于man zshcontrib]。

在使用它之前,您需要autoload -U zmv使用它来加载它。

相当强大。要解决您的问题:

zmv -n '([a-zA-Z])(*)' '${(L)1}/${1}${2}'

解释:

  • zmv -n-n标志的意思是“不要这样做,只要显示如果我没有告诉你不要这样做,你会做什么”。
  • 第一部分是我们的匹配模式。我们想要匹配文件名的两个部分,我们在(..)其中(每个匹配一个)。[如果我们省略括号,zsh 仍然会匹配,但我们稍后将无法引用该匹配]。如果它是字母,我们匹配第一个字符,以及其他所有字符。
  • 后半部分是我们将文件移动到的位置。我们获取第一个匹配的 glob(这是第一个字符):${<number>}, (其中<number>是第一部分中匹配的 glob 的索引)并将其转换为小写 with (L)。然后我们在文件名中添加一个/,这将为我们将文件放入一个目录中。最后,我们将文件名写回两部分:未修改的第一个字符,以及其他所有内容${1}${2}

有关更多示例,请查看此处这个页面有一些更基本的信息。

如果你小心的话,你可以在一行中重命名多个子目录中的数百个文件**。例如:

zmv -n "(**/)(*). TV-Show-Name-(*)-S(*).avi" '${1}S0${4}E${2} - ${3}.avi'

将重命名当前目录的每个子目录中的每个 avi 文件。最困难的部分是确定正则表达式以匹配您想要的文件。

请使用-n检查您将要运行的命令是否按照您的想法执行。

于 2013-07-08T14:59:25.177 回答