Bien que l'utilisation de la findcommande puisse être utile ici, le shell lui-même fournit des options pour répondre à cette exigence sans aucun outil tiers. Le bashshell 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 extglobqui doit être définie à l'aide de l' shoptoption ci-dessous. Les options sont activées avec le -ssupport et désactivées avec le -udrapeau. 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 globstarcela 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 *.csvfichiers dans les chemins récursifs
fileList=(**/*.csv)
L'option **est de récuser à travers les sous-dossiers et *.csvest 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 lsavec 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 findcommande). Par exemple, considérez le cas où vous devez obtenir tous les fichiers image récursifs, c'est-à-dire les extensions *.gif, *.pnget *.jpgtout 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 bashshells, cette option ne serait pas la bonne.