509 votes

Recherche récursive de fichiers avec une extension spécifique

J'essaie de trouver tous les fichiers avec une extension spécifique dans un répertoire et ses sous-répertoires avec mon bash (dernière version Ubuntu LTS).

C'est ce qui est écrit dans un fichier script :

#!/bin/bash

directory="/home/flip/Desktop"
suffix="in"

browsefolders ()
  for i in "$1"/*; 
  do
    echo "dir :$directory"
    echo "filename: $i"
    #   echo ${i#*.}
    extension=`echo "$i" | cut -d'.' -f2`
    echo "Erweiterung $extension"
    if     [ -f "$i" ]; then        

        if [ $extension == $suffix ]; then
            echo "$i ends with $in"

        else
            echo "$i does NOT end with $in"
        fi
    elif [ -d "$i" ]; then  
    browsefolders "$i"
    fi
  done
}
browsefolders  "$directory"

Malheureusement, lorsque je lance ce script dans le terminal, le message suivant apparaît :

[: 29: in: unexpected operator

(avec $extension au lieu de 'in' )

Que se passe-t-il ici, où est l'erreur ? Mais cette accolade

2 votes

L'erreur provient d'un "{" manquant

847voto

Mat Points 104488
find $directory -type f -name "*.in"

est un peu plus court que tout cela (et plus sûr - il traite les espaces dans les noms de fichiers et de répertoires).

Votre script échoue probablement pour les entrées qui n'ont pas d'identifiant . en leur nom, en faisant $extension vide.

17 votes

Oui, find est récursif par défaut. Vous pouvez limiter les profondeurs si vous le souhaitez (voir la page de manuel).

1 votes

J'aimerais passer tous les fichiers trouvés comme arguments à un fichier jar. Comment cela est-il possible ?

8 votes

@flip : c'est une autre question. Posez une nouvelle question, en détaillant exactement ce que vous souhaitez faire et ce que vous avez essayé jusqu'à présent.

244voto

find {directory} -type f -name '*.extension'

Exemple : Pour trouver tous les csv dans le répertoire actuel et ses sous-répertoires :

find . -type f -name '*.csv'

64voto

Scott Wilson Points 5160

La syntaxe que j'utilise est un peu différente de celle suggérée par @Matt :

find $directory -type f -name \*.in

(c'est une touche de moins).

1 votes

Le script de Matt ne fonctionnera pas non plus s'il y a un fichier avec l'extension .in dans le répertoire courant, alors que le vôtre fonctionnera quand même. Voir stackoverflow.com/questions/5927369/

4 votes

@Shnatsel ce commentaire (et donc le vôtre) est tout simplement erroné.

1 votes

@gniourf_gniourf Vous devriez fournir des références pour votre affirmation, sinon on pourrait simplement argumenter : "Non, vous avez tort". Mais en fait, vous avez raison : gnu.org/software/bash/manual/html_node/Double-Quotes.html

14voto

rtrn Points 143

Sans utiliser find :

du -a $directory | awk '{print $2}' | grep '\.in$'

13voto

user1145905 Points 31
find "$PWD" -type f -name "*.in"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X