![¿Cómo probar si existen uno o más archivos con un prefijo en bash? por ejemplo [[-f foo*]]](https://rvso.com/image/178564/%C2%BFC%C3%B3mo%20probar%20si%20existen%20uno%20o%20m%C3%A1s%20archivos%20con%20un%20prefijo%20en%20bash%3F%20por%20ejemplo%20%5B%5B-f%20foo*%5D%5D.png)
¿Hay alguna manera de utilizar unExpansión de nombre de archivoDentro de untest
expresión, más específicamente, unexpresión condicional de bash?
Por ejemplo:
[[ -f foo* ]] && echo 'found it!' || echo 'nope!';
... saldrá"¡no!"ya sea si el foobar
archivo existe en el directorio actual o no.
Y añadiendo un var
me gusta...
bar=foo*
[[ -f `echo $bar` ]] && echo 'found it!' || echo 'nope!';
... saldrá"¡Lo encontré!"si el foobar
archivo existe, pero solo si la echo $bar
expansión devolvió solo un archivo.
Respuesta1
Lo siguiente supone que no le importa si el globo coincide con algún archivo, incluidos archivos especiales de bloque, archivos especiales de caracteres, directorios, enlaces simbólicos, etc.
Este es el caso de uso ideal para failglob
:
shopt -s failglob
if echo foo* &>/dev/null
then
# files found
else
# no files found
fi
O, si necesita la lista de archivos, si existen:
shopt -s failglob
files=(foo*)
if [[ "${#files[@]}" -eq 0 ]]
then
# no files found
else
# files found
fi
Si no se encontraron archivos es un error, puede simplificar esto:
set -o errexit
shopt -s failglob
files=(foo*)
# We know that the expansion succeeded if we reach this line
Antigua respuesta
Este podría ser un uso legítimo (¡raro!) ls
en un script:
if ls foo* &>/dev/null
then
…
else
…
fi
Alternativamente, find foo* -maxdepth 0 -printf ''
.
Respuesta2
Residencia enesta respuesta, podemos usar shopt -s nullglob
para asegurarnos de que se devuelva la nota si el directorio está vacío:
[[ -n "$(shopt -s nullglob; echo foo*)" ]] && echo 'found it!' || echo 'nope!';
Respuesta3
Para completar, aquí hay algunos ejemplos que utilizan find
:
#!/bin/bash
term=$1
if find -maxdepth 1 -type f -name "$term*" -print -quit | grep -q .; then
echo "found"
else
echo "not found"
fi
if [ -n "$(find -maxdepth 1 -type f -name "$term*" -print -quit)" ]; then
echo "found"
else
echo "not found"
fi
Y algunas pruebas:
user@host > find -type f
./foobar
./bar/foo
./bar/bar
./find_prefixed_files.sh
./ba
user@host > ./find_prefixed_files.sh foo
found
found
user@host > ./find_prefixed_files.sh bar
not found
not found