Qu’est-ce qui se développe récursivement dans tous les fichiers du répertoire courant?

Je sais que **/*.ext s’étend à tous les fichiers dans tous les sous-répertoires correspondant à *.ext , mais quelle est une extension similaire qui inclut tous ces fichiers dans le répertoire actuel ?

    Cela fonctionnera dans Bash 4:

     ls -l {,**/}*.ext 

    Pour que la globstar double astérisque fonctionne, l’option globstar doit être définie (par défaut: on):

     shopt -s globstar 

    De l’ man bash :

         globstar
                       Si défini, le motif ** utilisé dans une extension de nom de fichier
                       le texte correspondra à un fichier et à zéro ou plusieurs répertoires et
                       sous-répertoires.  Si le motif est suivi d'un /, seulement
                       les répertoires et sous-répertoires correspondent.
    

    Cela imprimera tous les fichiers du répertoire en cours et de ses sous-répertoires qui se terminent par “.ext”.

     find . -name '*.ext' -print 

    Vous pouvez utiliser: **/*.* Pour inclure tous les fichiers de manière récursive (activer par: shopt -s globstar ).

    Veuillez trouver ci-dessous les tests des autres variantes et leur comportement.


    Dossier de test avec 3472 fichiers dans le dossier de référentiel VLC exemple:

    (Le nombre total de fichiers de 3472 est calculé comme suit: find . -type f | wc -l )

    • ls -1 **/*.* – renvoie 3338
    • ls -1 {,**/}*.* – renvoie 3341 (comme proposé par Dennis )
    • ls -1 {,**/}* – renvoie 8265
    • ls -1 **/* – renvoie 7817, sauf les fichiers cachés (comme proposé par Dennis )
    • ls -1 **/{.[^.],}* – renvoie 7869 (comme proposé par Dennis )
    • ls -1 {,**/}.?* – renvoie 15855
    • ls -1 {,**/}.* – renvoie 20321

    Donc, je pense que la méthode la plus proche pour lister tous les fichiers de manière récursive est le premier exemple ( **/*.* ) Selon le commentaire de gniourf-gniourf (en supposant que les fichiers ont les extensions appropriées, ou utilisent le spécifique) donne quelques autres doublons comme ci-dessous:

     $ diff -u < (ls -1 {,**/}*.*) <(ls -1 **/*.*) --- /dev/fd/63 2015-04-19 15:25:07.000000000 +0100 +++ /dev/fd/62 2015-04-19 15:25:07.000000000 +0100 @@ -1,6 +1,4 @@ COPYING.LIB -COPYING.LIB -Makefile.am Makefile.am @@ -45,7 +43,6 @@ compat/tdestroy.c compat/vasprintf.c configure.ac -configure.ac 

    et l'autre génère encore plus de doublons.


    Pour inclure les fichiers cachés, utilisez: shopt -s dotglob (désactiver par shopt -u dotglob ). Ce n'est pas recommandé, car cela peut affecter des commandes telles que mv ou rm et vous pouvez supprimer accidentellement les mauvais fichiers.

     $ find . -type f 

    Cela listera tous les fichiers du répertoire en cours. Vous pouvez ensuite faire une autre commande sur la sortie en utilisant -exec

     $find . -type f -exec grep "foo" {} \; 

    Cela va grep chaque fichier de la recherche pour la chaîne “foo”.

    Pourquoi ne pas utiliser l’extension des accolades pour inclure également le répertoire actuel?

     ./{*,**/*}.ext 

    L’expansion de Brace se produit avant l’expansion de glob, vous pouvez donc faire ce que vous voulez avec les anciennes versions de bash, et vous pouvez renoncer à jouer avec globstar dans les nouvelles versions.

    En outre, il est considéré comme une bonne pratique de bash d’inclure les principaux éléments ./ dans vos modèles globaux.