2017-06-13 3 views
1

Je veux répertorier tous les fichiers dans certains répertoires, donc je veux créer un tableau de tous les répertoires et les lister récursivement dans une boucle. Mais,Utiliser les modèles de fichier dans une variable pour lister les fichiers [BASH]

ls /home/user/{*.txt,*.sh} 

répertorie tous les fichiers correctement. Mais quand j'utilise

location="/home/user/{*.txt,*.sh}" 
ls $location # Error 
ls "$location" # Error 
ls ${location} # Error 

il me donne une erreur en disant que ce fichier n'existe pas. En outre, la deuxième méthode fonctionne très bien s'il n'y a que location="/home/user/*.sh". Quelqu'un peut-il aider?

Répondre

4

Cela est dû au fait que l'expansion de l'accolade est effectuée avant la substitution de variable.

https://www.gnu.org/software/bash/manual/html_node/Shell-Expansions.html#Shell-Expansions

Peut-être la solution suivante peut aider à l'aide de petites boules longues

shopt -s extglob 
location="/home/user/*[email protected](txt|sh)" 
ls $location 

ou

location="/home/user/@(*.txt|*.sh)" 
+0

Propre et simple. Je ne connaissais pas les champs regex étendus. Merci! Plus à ce sujet [ici] (http://www.linuxjournal.com/content/bash-extended-globbing). –

+0

ce n'est pas regex mais le motif glob, syntaxe différente (plus faible), si vous pouvez mettre à jour le titre pour être plus clair: Dans la question c'est l'expansion de l'accolade. –