Apprenez en lisant dans l'ordre

Trouver des fichiers — find et les wildcards

Apprends à désigner plusieurs noms de fichiers d'un coup avec les wildcards * ? [], et comment find cherche par nom avec -name et par type avec -type — tout en pratique dans un terminal en navigateur.

Les wildcards — * ? []

Les wildcards sont des symboles pour désigner en masse une partie d'un nom de fichier.

* correspond à une suite de zéro caractère ou plus, ? correspond à exactement un caractère, et [] correspond à l'un quelconque des caractères entre les crochets.

Combine-les avec ls, comme ls *.txt, pour lister uniquement les noms qui correspondent.

Ce à quoi correspond chaque wildcard
*.txtfile?.logdata[12].csvtous les fichiersfinissant en .txtun caractèreaprès filedata1.csv ou data2.csv
* correspond à n'importe quelle suite, ? à un caractère, et [] à l'un quelconque des caractères entre les crochets.
SymboleCe à quoi il correspondExempleFichiers correspondants
*Une suite de zéro caractère ou plus*.txta.txt note.txt
?Exactement un caractèrelog?.txtlog1.txt (log10.txt ne correspond pas)
[...]L'un quelconque des caractères entre les crochetslog[12].txtlog1.txt log2.txt
[a-c]L'un quelconque des caractères de l'intervallef[a-c].txtfa.txt fb.txt fc.txt
touch a.txt b.txt note.log         # crée les fichiers de travail
ls *.txt                           # a.txt b.txt
ls *.log                           # note.log
ls ?.txt                           # a.txt b.txt (un caractère + .txt)

① Crée trois fichiers avec des extensions différentes en utilisant touch a.txt b.txt note.log.

② Combine un wildcard avec ls pour lister uniquement les fichiers finissant en .txt.

③ Ensuite liste uniquement les fichiers finissant en .log, et confirme que tu peux filtrer par nom. (Lance-le correctement et une explication apparaîtra.)

Linux console
0 / 3 exécutée(s)
Loading Linux Terminal...

Un caractère ou un choix — ? et []

? correspond toujours à exactement un caractère, donc utilise-le quand tu veux fixer le nombre de caractères.

[] correspond à l'un quelconque des caractères écrits entre les crochets, donc [12] vaut 1 ou 2, et tu peux écrire un intervalle comme [a-c].

Ils filtrent les cibles plus finement que *.

touch log1.txt log2.txt log9.txt logA.txt   # crée le matériel
ls log?.txt                                  # les 4 avec un caractère final
ls log[12].txt                               # uniquement log1.txt log2.txt

① Crée quatre fichiers nommés en séquence avec touch log1.txt log2.txt log9.txt logA.txt.

② Combine ls avec ? pour lister les fichiers où log est suivi d'un caractère et finit en .txt.

③ Utilise [] pour filtrer jusqu'à seulement log1.txt et log2.txt. Ensuite confirme qu'un intervalle comme [1-2] filtre les 2 mêmes fichiers.

Linux console
0 / 3 exécutée(s)
Loading Linux Terminal...

Chercher par condition — find -name / -type

find parcourt récursivement sous un répertoire de départ et cherche les éléments qui remplissent une condition.

Avec find depart -name 'motif' tu poses une condition sur le nom, et avec -type f (fichier) ou -type d (répertoire) tu poses une condition sur le type.

Utilise-le pour trouver des fichiers par nom quand ils sont enfouis profondément dans la hiérarchie.

ConditionSignificationExemple
-name 'motif'Le nom correspond au motiffind . -name '*.log'
-type fFichiers ordinaires uniquementfind . -type f
-type dRépertoires uniquementfind . -type d
Les conditions de find et ce à quoi elles correspondent
find . -name '*.txt'find . -type ffind . -type déléments nommés .txtfichiers uniquementrépertoires uniquement
-name filtre par motif de nom, -type f par fichier, et -type d par répertoire.
mkdir -p tree/sub                  # crée l'arborescence de travail
touch tree/a.txt tree/sub/b.txt    # place des fichiers dans la hiérarchie
find tree -name '*.txt'            # cherche les .txt sous tree récursivement
find tree -type d                  # uniquement les répertoires sous tree

Mets le motif de find entre guillemets

Entoure le '*.txt' dans find . -name '*.txt' de guillemets simples.

Sans guillemets, le shell développe * d'abord, ce qui peut viser autre chose que ce que tu voulais.

La règle de base est de mettre le motif de -name entre guillemets et de le passer à find lui-même.

① Crée un répertoire à deux niveaux avec mkdir -p tree/sub.

② Place des fichiers à la fois dans le parent et dans le sous-répertoire avec touch tree/a.txt tree/sub/b.txt.

③ Passe tree à find comme point de départ et cherche récursivement les fichiers .txt par la condition de nom.

④ Ensuite liste uniquement les fichiers par la condition de type (find tree -type f), liste aussi uniquement les répertoires, et compare les trois résultats.

Linux console
0 / 5 exécutée(s)
Loading Linux Terminal...
QUIZ

Vérification des connaissances

Répondez à chaque question une par une.

Question 1À quoi correspond le wildcard * ?

Question 2À quels fichiers correspond ls log[12].txt ?

Question 3Qu'est-ce qui s'affiche quand tu lances find tree -type d ?