不区分大小写的目录搜索?

不区分大小写的目录搜索?

我正在努力重建几个现有文件夹的文件夹结构。因此,如果有任何文件夹丢失,我将不得不添加它。

首先使用 if 命令检查目录是否存在,如果不存在则创建一个。由于区分大小写,我最终再次创建相同的文件夹。

示例:带有 ABC 的文件夹已经存在,但正在检查 abc,因此再次使用 abc 创建一个新文件夹,有时带有 Abc 的文件夹存在。

答案1

bash

shopt -s nullglob nocaseglob
set -- [a]bc/
if [ "$#" -gt 0 ]; then
    echo 'There is at least one directory called "abc" (case ignored):'
    printf '\t%s\n' "$@"
fi

此处使用两个bashshell 选项nullglobnocaseglob来测试是否[a]bc/存在与该模式匹配的任何目录(不区分大小写)。该nullglob选项确保在没有匹配项时删除模式(否则不展开),并且nocaseglob使模式匹配不区分大小写。

我们使用[a]bc/而不只是abc仅调用与目录匹配的文件名。我们[a]强制 shell 执行通配符,从而拾取全部匹配名称,并通过尾随/我们将匹配限制为仅匹配目录。将此作为参数来set将位置参数设置为匹配的目录名称。然后可以在 中找到这些$@并且可以在 中找到匹配的数量$#

测试:

$ mkdir abc aBc ABc   # create three directories with only case diffs in their names
$ touch abC           # ... and also a file

$ bash ./script.sh
There is at least one directory called "abc" (case ignored):
        ABc/
        aBc/
        abc/

答案2

代替

if [ -d abc ] ; then
    echo 'Directory exists'

使用

if /bin/ls -d [aA][bB][cC]/ &> /dev/null ; then
    echo 'Directory exists'

答案3

在 中zsh,您可以检查一个或多个文件是否属于目录并且其名称abc不区分大小写地存在于:

set -o extendedglob # best in ~/.zshrc
if () { (($#)); } (#i)abc(/N); then
  echo such directories exist
fi

这是一个调用匿名函数 ( () { body; } args) 的函数体,其中的主体是(($#))检查参数的数量是否非零,并且 args 是(#i)abc(/N)glob 扩展的结果,其中(#i)打开不区分大小写的匹配,并且(/N)全局限定符其中/限制文件类型目录N启用nullglob,以便在没有匹配项时 glob 扩展为空,而不是报告错误。

相关内容