¿Cómo probar si existen uno o más archivos con un prefijo en bash? por ejemplo [[-f foo*]]

¿Cómo probar si existen uno o más archivos con un prefijo en bash? por ejemplo [[-f foo*]]

¿Hay alguna manera de utilizar unExpansión de nombre de archivoDentro de untestexpresió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 foobararchivo existe en el directorio actual o no.

Y añadiendo un varme gusta...

bar=foo*
[[ -f `echo $bar` ]] && echo 'found it!' || echo 'nope!';

... saldrá"¡Lo encontré!"si el foobararchivo existe, pero solo si la echo $barexpansió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!) lsen un script:

if ls foo* &>/dev/null
then
else
fi

Alternativamente, find foo* -maxdepth 0 -printf ''.

Respuesta2

Residencia enesta respuesta, podemos usar shopt -s nullglobpara 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

información relacionada