Pesquisa de diretório insensível a maiúsculas e minúsculas?

0

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.

    
por user_297020 18.07.2018 / 08:03

2 respostas

2

Em vez de

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

use

if /bin/ls -d [aA][bB][cC]/ &> /dev/null ; then
    echo 'Directory exists'
    
por 18.07.2018 / 08:19
3

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/
    
por 18.07.2018 / 08:55