Em vez de
if [ -d abc ] ; then
echo 'Directory exists'
use
if /bin/ls -d [aA][bB][cC]/ &> /dev/null ; then
echo 'Directory exists'
Estou trabalhando na reestruturação da estrutura de pastas de algumas pastas existentes. Portanto, se houver alguma pasta perdida, terei de adicioná-la.
Primeiramente estou verificando se o diretório existe ou não com se comando, se não estiver presente estou criando um. Como é caso sensível, estou acabando criando a mesma pasta novamente.
Exemplo: Uma pasta com ABC já existe, mas estou verificando com abc, então novamente uma nova pasta é criada com abc, às vezes a pasta existe com o Abc.
Em 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
As duas opções bash
shell nullglob
e nocaseglob
são usadas aqui para testar se existe algum diretório que corresponda ao padrão [a]bc/
e não diferencia maiúsculas de minúsculas. A opção nullglob
garante que o padrão seja expandido para uma sequência vazia, se não houver correspondência, e o nocaseglob
torna as correspondências de padrão insensíveis a maiúsculas e minúsculas.
Usamos [a]bc/
em vez de apenas abc
para invocar a correspondência de nome de arquivo apenas nos diretórios. Com [a]
, forçamos o shell a glob e pegamos todos os nomes correspondentes (não apenas abc
, que, como estamos fazendo globbing sem distinção entre maiúsculas e minúsculas, pode não existir) e com o /
à direita restringimos a correspondência apenas para diretórios. ( abc
ou abc/
seria definido como está, sem globbing.) Fazer isso como um argumento para set
configura os parâmetros posicionais para os nomes de diretório correspondentes. Eles estão disponíveis em $@
e o número de correspondências é encontrado em $#
.
Teste:
$ 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/