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 regex
para comprobar si un directorio en particular tiene carpetas que comiencen con una palabra específica?
Respuesta1
-d
no 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
nullglob
hace 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 -regex
la 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 wc
para 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 regex
no estará bien elegido, pero considere establecer el valor en "$1"
Me gusta regex="$1"
. El siguiente paso es cambiar la if
declaració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.