La meilleure façon d'étendre le modèle glob?

29

J'ai besoin d'étendre un modèle glob (comme ../smth*/*, ou /etc/cron*/) dans une liste de fichiers, par programme. Quelle serait la meilleure façon de procéder?

Rogach
la source
2
Vous n'avez rien à faire de spécial, ne citez pas le *.
Kevin
1
Bien que si vous essayez de l'analyser, utilisez un tableau comme le dit la réponse.
Kevin

Réponses:

40

Laissez-le simplement se développer à l'intérieur du côté droit d'une déclaration de tableau:

list=(../smth*/)          # grab the list
echo "${#list[@]}"        # print array length
echo "${list[@]}"         # print array elements
for file in "${list[@]}"; do echo "$file"; done  # loop over the array


Notez que l'option shell nullglobdoit être définie.
Il n'est pas défini par défaut.
Il empêche une erreur dans le cas où le glob (ou l'un des globs multiples) ne correspond à aucun nom.

Installez-le bashavec

shopt -s nullglob

ou zshavec

setopt nullglob
homme au travail
la source
Et comment puis-je imprimer cette liste par la suite?
Rogach
C'est juste un tableau régulier. Vous pouvez faire tout ce que vous pouvez avec n'importe quel tableau. Ajout de quelques exemples.
manatwork
1
Il ya un problème. Si le motif ne correspond à aucun fichier, il s'imprime - ce qui n'est pas très bon.
Rogach
5
Ah, shopt -s nullglob le résout.
Rogach
1
@lindhe, unsetoptet le même paramètre que celui utilisé pour setopt.
manatwork
-1

Pas besoin de trop compliquer les choses:

echo your/stuff*
Alexei Averchenko
la source
ça ne marche pas. Par exemple: TEST=$(echo your/stuff*) && eval \"$TEST\"affichera:your/stuff*: No such file or directory
Sebastian
@Sebastian c'est un problème de nullglob, voir ci
Alexei Averchenko
1
Non, ce n'est pas un problème nullglob. L'utilisation de caractères scape consiste à évaluer la TESTvariable comme une chaîne incluant *et non développée.
Sebastian