En bash, ¿puede probar -e buscar un archivo con un nombre de semi-variable usando *?

0

Tengo un if y luego buscando un determinado conjunto de archivos. Todos comienzan con lib, por lo que podría establecer un "if" para cada uno o esperaba que hubiera una forma de usar un asterisco.

Esto es lo que tengo y lo que probé.

 d=myfolder
 if [[ -e $d/lib* ]]; then
  mv /etc/launchd.conf $d/launchd.conf
 else
  2>/dev/null; true
 fi

como puede ver, si alguno de esos archivos lib está presente, también quiero mover el archivo launchd.conf. Pero el asterisco no lo está haciendo. ¿Alguna idea?

    
pregunta ElRojito 17.11.2014 - 15:55

1 respuesta

1

Desde man bash

[[ expression ]]
      Return a status of 0 or 1 depending on the evaluation of the conditional 
      expression expression.  Expressions  are composed  of  the primaries 
      described below under CONDITIONAL EXPRESSIONS. Word splitting and pathname
      expansion are not performed on the words between the [[ and ]]; tilde 
      expansion, parameter and variable  expansion,  arithmetic expansion, command 
      substitution, process substitution, and quote removal are performed.
      Conditional operators such as -f must be unquoted to be recognized as primaries.

O en resumen, el patrón no está expandido.

Una alternativa simple podría verse como

if [[ $(echo $d/lib*) != "$d/lib*" ]]; then
    mv /etc/launchd.conf $d/launchd.conf
fi

Explicación breve sobre cómo funciona esto:

  • echo $d/lib* se expande a una lista de archivos de la biblioteca si hay alguno presente, esta lista no es igual a $d/lib* (que no se expande), por lo que se ejecuta mv
  • OTOH si no hay archivos de biblioteca presentes, el eco devuelve la cadena $d/lib* , el != se evalúa como falso y el mv no se ejecuta
respondido por el nohillside 17.11.2014 - 16:16

Lea otras preguntas en las etiquetas