Use regex para verificar se um determinado diretório tem pastas iniciando com uma palavra específica

1

Estou escrevendo um script que verifica um determinado diretório em busca de qualquer subdiretório que comece 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 regex para verificar se um determinado diretório tem alguma pasta que comece com uma palavra específica?

    
por Nicholas Adamou 09.06.2016 / 12:44

3 respostas

1

Se você quiser apenas encontrar diretórios correspondentes a um determinado padrão / prefixo, eu acho que você poderia usar apenas find :

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

ou, se você quiser apenas subdiretórios imediatos :

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

Claro, também há -regex se você precisar de uma correspondência regex real. (ressalva: não me lembro se -maxdepth é um gnu-ismo.)

(update) Certo, você queria uma declaração if. Find sempre retorna um zero, então não podemos usar o valor de retorno para verificar se algo foi encontrado (diferente do grep). Mas podemos, por exemplo conte as linhas. Canalize a saída através de wc para obter a contagem e, em seguida, 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
    
por 09.06.2016 / 13:18
2

-d nã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

nullglob faz com que os caracteres curinga sejam expandidos para listas vazias, se não houver correspondência. Em um script maior, altere seu valor em um subshell ou retorne o valor antigo quando não precisar dele.

    
por 09.06.2016 / 12:54
1

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

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

para

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

O script será:

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
}

De um shell, você pode criar seu script por:

. /path/to/script

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

checkDirectory test
Directories don't exist.
    
por 09.06.2016 / 13:07