我正在努力重建几个现有文件夹的文件夹结构。因此,如果有任何文件夹丢失,我将不得不添加它。
首先使用 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
此处使用两个bash
shell 选项nullglob
和nocaseglob
来测试是否[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 扩展为空,而不是报告错误。