Bien que l'utilisation de la find
commande puisse être utile ici, le shell lui-même fournit des options pour répondre à cette exigence sans aucun outil tiers. Le bash
shell fournit une option de prise en charge globale étendue à l'aide de laquelle vous pouvez obtenir les noms de fichiers sous des chemins récursifs qui correspondent aux extensions souhaitées.
L'option étendue est celle extglob
qui doit être définie à l'aide de l' shopt
option ci-dessous. Les options sont activées avec le -s
support et désactivées avec le -u
drapeau. De plus, vous pouvez utiliser plusieurs options, c'est- nullglob
à- dire dans lesquelles un glob inégalé est entièrement balayé, remplacé par un ensemble de zéro mot. Et globstar
cela permet de récuser à travers tous les répertoires
shopt -s extglob nullglob globstar
Maintenant, tout ce que vous devez faire est de former l'expression glob pour inclure les fichiers d'une certaine extension que vous pouvez faire comme ci-dessous. Nous utilisons un tableau pour remplir les résultats globaux car lorsqu'ils sont correctement cités et développés, les noms de fichiers avec des caractères spéciaux restent intacts et ne sont pas cassés en raison de la séparation des mots par le shell.
Par exemple pour lister tous les *.csv
fichiers dans les chemins récursifs
fileList=(**/*.csv)
L'option **
est de récuser à travers les sous-dossiers et *.csv
est une extension globale pour inclure n'importe quel fichier des extensions mentionnées. Maintenant, pour imprimer les fichiers réels, faites simplement
printf '%s\n' "${fileList[@]}"
Utiliser un tableau et faire une expansion entre guillemets appropriée est la bonne façon lorsqu'il est utilisé dans des scripts shell, mais pour une utilisation interactive, vous pouvez simplement utiliser ls
avec l'expression glob comme
ls -1 -- **/*.csv
Cela pourrait très bien être étendu pour correspondre à plusieurs fichiers, c'est-à-dire un fichier se terminant par plusieurs extensions (c'est-à-dire similaire à l'ajout de plusieurs indicateurs dans la find
commande). Par exemple, considérez le cas où vous devez obtenir tous les fichiers image récursifs, c'est-à-dire les extensions *.gif
, *.png
et *.jpg
tout ce dont vous avez besoin est
ls -1 -- **/+(*.jpg|*.gif|*.png)
Cela pourrait très bien être étendu pour avoir également des résultats négatifs. Avec la même syntaxe, on pourrait utiliser les résultats du glob pour exclure des fichiers d'un certain type. Supposons que vous souhaitez exclure les noms de fichiers avec les extensions ci-dessus, vous pouvez le faire
excludeResults=()
excludeResults=(**/!(*.jpg|*.gif|*.png))
printf '%s\n' "${excludeResults[@]}"
La construction !()
est une opération de négation qui n'inclut aucune des extensions de fichier répertoriées à l'intérieur et |
est un opérateur d'alternance tout comme utilisé dans la bibliothèque des expressions régulières étendues pour effectuer une correspondance OU des globes.
Notez que cette prise en charge étendue de glob n'est pas disponible dans le shell POSIX bourne et son purement spécifique aux versions récentes de bash
. Donc, si vous envisagez la portabilité des scripts exécutés sur POSIX et les bash
shells, cette option ne serait pas la bonne.