0 votos

En bash, ¿puede test -e buscar un archivo con un nombre semivariable usando *?

Tengo un if then que busca un determinado conjunto de archivos. Todos comienzan con lib, así que podría establecer un if then para cada uno o esperaba que hubiera una forma de usar un asterisco.

Esto es lo que tengo y lo que he probado.

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

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

1voto

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 pocas palabras, el patrón no se expande.

Una alternativa sencilla podría ser la siguiente

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

Breve explicación de cómo funciona:

  • 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 el mv se ejecuta
  • Por otra parte, si no hay archivos de biblioteca, el eco devuelve la cadena $d/lib* El != se evalúa como falso y el mv no se ejecuta

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X