Utilice expresiones regulares para comprobar si un directorio en particular tiene carpetas que comienzan con una palabra específica

Utilice expresiones regulares para comprobar si un directorio en particular tiene carpetas que comienzan con una palabra específica

Estoy escribiendo un script que busca en un determinado directorio subdirectorios que comiencen con una palabra específica.

Aquí está mi guión hasta el momento:

#!/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
}

Entonces, ¿cómo utilizarías regexpara comprobar si un directorio en particular tiene carpetas que comiencen con una palabra específica?

Respuesta1

-dno acepta expresiones regulares, acepta nombres de archivos. Si sólo desea comprobar un prefijo simple, un comodín es 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

nullglobhace que los comodines se expandan a listas vacías si no hay coincidencias. En un script más grande, cambie su valor en un subshell o restablezca el valor anterior una vez que ya no lo necesite.

Respuesta2

Si solo desea encontrar directorios que coincidan con un patrón/prefijo determinado, creo que podría usar find:

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

o, si solo quieresinmediatosubdirectorios:

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

Por supuesto, también existe -regexla posibilidad de que necesite una coincidencia de expresiones regulares real. (advertencia: no recuerdo si -max Depth es un gnu-ismo).

(actualización) Bien, querías una declaración if. Find siempre devuelve un cero, por lo que no podemos usar el valor de retorno para verificar si se encontró algo (a diferencia de grep). Pero podemos, por ejemplo, contar las líneas. Canalice la salida wcpara obtener el recuento, luego vea si no es cero:

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

Respuesta3

El nombre de su variable regexno estará bien elegido, pero considere establecer el valor en "$1"Me gusta regex="$1". El siguiente paso es cambiar la ifdeclaración de:

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

a

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

El guión quedará:

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
}

Desde un shell puede obtener su script de la siguiente manera:

. /path/to/script

Y la función está lista para usar:

checkDirectory test
Directories don't exist.

información relacionada