Use regex para verificar se um diretório específico possui pastas começando com uma palavra específica

Use regex para verificar se um diretório específico possui pastas começando com uma palavra específica

Estou escrevendo um script que verifica um determinado diretório em busca de subdiretórios começando com uma palavra específica.

Aqui está meu script até agora:

#!/bin/bash

function checkDirectory() {
    themeDirectory="/usr/share/themes"
    iconDirectory="/usr/share/icons"
    # I don't know what to put for the regex. 
    regex=

    if [ -d "$themeDirectory/$regex" && -d "$iconDirectory/$regex" ]; then
       echo "Directories exist."
    else
       echo "Directories don't exist."
    fi
}

Então, como você usaria regexpara verificar se um determinado diretório possui alguma pasta começando com uma palavra específica?

Responder1

-dnão aceita regexes, aceita nomes de arquivos. Se você quiser apenas verificar um prefixo simples, um curinga é suficiente:

exists=0
shopt -s nullglob
for file in "$themeDirectory"/word* "$iconDirectory"/* ; do
    if [[ -d $file ]] ; then
        exists=1
        break
    fi
done
if ((exists)) ; then
    echo Directory exists.
else
    echo "Directories don't exist."
fi

nullglobfaz com que os curingas se expandam para listas vazias se não houver correspondências. Em um script maior, altere seu valor em um subshell ou defina o valor antigo quando não precisar dele.

Responder2

Se você deseja apenas encontrar diretórios que correspondam a um determinado padrão/prefixo, acho que você pode usar find:

find /target/directory -type d -name "prefix*"

ou, se você quiser apenasimediatosubdiretórios:

find /target/directory -maxdepth 1 -type d -name "prefix*"

Claro, também existe -regexse você precisar de uma correspondência real de regex. (advertência: não me lembro se -maxprofundidade é um gnu-ismo.)

(atualização) Certo, você queria uma instrução if. Find sempre retorna zero, portanto não podemos usar o valor de retorno para verificar se algo foi encontrado (ao contrário do grep). Mas podemos, por exemplo, contar as linhas. Canalize a saída wcpara obter a contagem e veja se não é zero:

if [ $(find /target/directory -type d -name "prefix*" | wc -l ) != "0" ] ; then
    echo something was found
else
    echo nope, didn't find anything
fi

Responder3

O nome da sua variável regexnão será bem escolhido, mas considere definir o valor como "$1"like regex="$1". O próximo passo é alterar a ifdeclaração de:

if [ -d "$themeDirectory/$regex" && -d "$iconDirectory/$regex" ]; then

para

if [ -d "$themeDirectory/$regex" ] && [ -d "$iconDirectory/$regex" ]; then

O script se tornará:

function checkDirectory() {
    themeDirectory="/usr/share/themes"
    iconDirectory="/usr/share/icons"
    # I don't know what to put for the regex. 
    regex="$1"

    if [ -d "$themeDirectory/$regex" ] && [ -d "$iconDirectory/$regex" ]; then
       echo "Directories exist."
    else
       echo "Directories don't exist."
    fi
}

A partir de um shell, você pode obter seu script:

. /path/to/script

E a função está pronta para uso:

checkDirectory test
Directories don't exist.

informação relacionada