web-dev-qa-db-fra.com

comment faire en sorte que bash développe les jokers dans les variables?

J'essaie d'obtenir le même effet que de taper

mv ./images/*.{pdf,eps,jpg,svg} ./images/junk/  

sur la ligne de commande, depuis un script bash. J'ai:

MYDIR="./images"
OTHERDIR="./images/junk"  
SUFFIXES='{pdf,eps,jpg,svg}'
mv "$MYDIR/"*.$SUFFIXES "$OTHERDIR/"

qui, lorsqu'il est exécuté, donne l'erreur non inattendue:

mv: rename ./images/*.{pdf,eps,jpg,svg} to ./images/junk/*.{pdf,eps,jpg,svg}: 
No such file or directory

Quelle est la bonne façon de citer tout cela pour que mv réalise réellement l’extension souhaitée? (Oui, de nombreux fichiers correspondent au modèle décrit dans ./images/.)

24
Ross Duncan

Une réponse supprimée était sur la bonne voie. Une légère modification à votre tentative:

shopt -s extglob
MYDIR="./images"
OTHERDIR="./images/junk"  
SUFFIXES='@(pdf|eps|jpg|svg)'
mv "$MYDIR/"*.$SUFFIXES "$OTHERDIR/"

L'expansion d'accolade est effectuée avant l'expansion variable, mais l'expansion variable est effectuée avant l'expansion du chemin. Les accolades sont donc toujours des accolades lorsque la variable est développée dans l'original, mais lorsque la variable contient des éléments de chemin d'accès, elles ont déjà été développées lorsque l'extension du chemin d'accès est terminée.

26
Dennis Williamson

Vous devez évaluer cette ligne pour que cela fonctionne, comme ceci:

MYDIR="./images"
OTHERDIR="./images/junk"  
SUFFIXES='{pdf,eps,jpg,svg}'
eval "mv \"$MYDIR\"/*.$SUFFIXES \"$OTHERDIR/\""

Maintenant, cela pose des problèmes, en particulier si vous ne faites pas confiance à $SUFFIXES, il pourrait contenir une attaque par injection, mais dans ce cas simple, tout devrait bien se passer.

Si vous êtes ouvert à d'autres solutions, vous pouvez expérimenter avec find et xargs.

8
falstro

Vous pouvez écrire une fonction:

function expand { for arg in "$@"; do [[ -f $arg ]] && echo $arg; done }

puis appelez-le avec ce que vous voulez développer:

expand "$MYDIR/"*.$SUFFIXES

Vous pouvez également en faire un script expand.sh si vous le souhaitez.

0
Dagang