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 regex
para verificar se um determinado diretório possui alguma pasta começando com uma palavra específica?
Responder1
-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 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 -regex
se 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 wc
para 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 regex
não será bem escolhido, mas considere definir o valor como "$1"
like regex="$1"
. O próximo passo é alterar a if
declaraçã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.