In bash, puoi provare -e cercare un file con un nome semi-variabile usando *?

0

Ne ho uno se poi cerco un certo insieme di file. Iniziano tutti con lib, quindi potrei impostare un if se up per ognuno o speravo che fosse possibile utilizzare un asterisco.

Ecco cosa ho e cosa ho provato.

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

così come puoi vedere, se qualcuno di quei file lib è presente voglio spostare anche il file launchd.conf. ma l'asterisco non lo sta facendo. Qualche idea?

    
posta ElRojito 17.11.2014 - 15:55
fonte

1 risposta

1

Da 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.

In breve, il modello non è espanso.

Una semplice alternativa potrebbe sembrare

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

Breve spiegazione su come funziona:

  • echo $d/lib* si espande in un elenco di file di libreria, se presenti, questo elenco non è uguale a $d/lib* (che non viene espanso) quindi viene eseguito mv
  • OTOH se non sono presenti file di libreria, l'eco restituisce la stringa $d/lib* , != restituisce false e mv non viene eseguito
risposta data 17.11.2014 - 16:16
fonte

Leggi altre domande sui tag