Bash 如何在shell脚本中执行不区分大小写的for循环

Bash 如何在shell脚本中执行不区分大小写的for循环,bash,shell,for-loop,zsh,case-insensitive,Bash,Shell,For Loop,Zsh,Case Insensitive,我正在尝试创建一个循环来创建目录,并将文件移动到这些目录中,这样我就可以按字母顺序对内容进行排序。以下是我所拥有的: 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命令没有捕获大写文件名,我不想为大写和小写文件名创建目录。解决办法是什么?或者如果你不想直接出来告诉我解决方案,我在哪里

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

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
命令没有捕获大写文件名,我不想为大写和小写文件名创建目录。解决办法是什么?或者如果你不想直接出来告诉我解决方案,我在哪里可以找到

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

在bash中,您可以使用

shopt -s nocaseglob

zsh
中,可以使用
zmv
。[我转到
man
页面,但它在中]

在使用它之前,您需要使用
autoload-uzmv
加载它

它非常强大。要解决您的问题:

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

  • zmv-n
    -n
    标志表示“不要这样做,只要显示如果我没有告诉你不要这样做你会做什么”
  • 第一部分是我们的匹配模式。我们希望匹配文件名的两个部分,这是在
    (..)
    中完成的(每个匹配一个)。[如果省略括号,zsh仍将匹配,但稍后将无法引用该匹配]。如果第一个字符是按字母顺序排列的,我们就匹配它,其他的都匹配
  • 下半部分是我们将文件移动到的位置。我们获取第一个匹配的glob(它是第一个字符):
    ${}
    ,(其中
    是第一部分中匹配的glob的索引),并使用
    (L)
    将其转换为小写。然后,我们在文件名中添加一个
    /
    ,这将为我们将文件放入一个目录中。最后,我们将文件名分为两部分写回:未修改的第一个字符和其他所有
    ${1}${2}
有关更多示例,请检查。有一些更基本的信息

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

zmv -n "(**/)(*). TV-Show-Name-(*)-S(*).avi" '${1}S0${4}E${2} - ${3}.avi'
将重命名当前目录的每个子目录中的每个avi文件。其中最困难的部分是确定正则表达式以匹配所需的文件


请使用
-n
检查您要运行的命令是否与您认为的一样。

太棒了!我通常使用ZSH,但我编写的脚本也是为了在bash中工作,所以目前无法使用它。我一定会记住这一点。