La commande find est utilisée pour rechercher des fichiers et des répertoires dans la ligne de commande Linux.
Rechercher est l'une des commandes les plus puissantes et les plus fréquemment utilisées. C'est également l'une des commandes les plus complètes avec plus de 50 options, ce qui la rend un peu déroutante, surtout lorsqu'elle est associée à la commande exec ou xargs.
Il est impossible pour un administrateur système ou un développeur de logiciels d'éviter la commande find tout en travaillant dans la ligne de commande. Au lieu d'en avoir peur, vous devriez embrasser son pouvoir.
Je vais discuter de certains des exemples les plus courants de la commande find que vous êtes susceptible d'utiliser. Mais avant cela, laissez-moi vous montrer sa syntaxe et comment l'utiliser.
Rechercher la commande sous Linux
La syntaxe générale de la commande find est :
find [directory to search] [options] [expression]
Tout ce qui est entre parenthèses [] est facultatif. Cela signifie que vous pouvez exécuter find
commande sans options ni arguments. Il ne fera que vider tous les fichiers et répertoires de l'emplacement actuel. Ce n'est pas très utile, n'est-ce pas ?
Voyons cela plus en détail :
directory to search
est essentiellement l'endroit à partir duquel vous souhaitez commencer votre recherche. Par défaut, la recherche est récursive et commence à partir de votre emplacement actuel.options
spécifiez le type de recherche, que ce soit par nom, par type, par heure modifiée, etc. Il y a plus de 50 options possibles ici.expression
vous permet de spécifier le terme de recherche. Si vous souhaitez rechercher un fichier par son nom, expression est le nom du fichier. Si vous souhaitez rechercher des fichiers dont le nom correspond à un modèle, expression dans le modèle.
Prenons un exemple simple :
find . -type f -name myfile
Cette commande lancera une recherche dans le répertoire courant et ses sous-répertoires pour trouver un fichier (pas le répertoire) nommé myfile
. L'option -type f
lui demande de rechercher uniquement des fichiers. Le point unique .
signifie le répertoire courant.
Voyons quelques exemples pratiques de la commande find.
Rechercher des fichiers et des répertoires par nom
Vous pouvez rechercher des fichiers et des répertoires par son nom :
find . -name SEARCH_NAME
Comme aucun type de fichier n'est mentionné, il recherche à la fois les fichiers et les répertoires portant le nom donné.
L'exemple ci-dessous trouve à la fois le fichier et les répertoires nommés mystuff :
[email protected]:~/Examples$ find -name mystuff
./new/mystuff
./mystuff
Rechercher uniquement des fichiers ou uniquement des répertoires
Si vous souhaitez uniquement rechercher des fichiers, spécifiez le type de fichier -f :
find . -type f -name SEARCH_NAME
L'ordre du type et du nom n'a pas d'importance. Reprenez l'exemple précédent et recherchez uniquement les fichiers :
[email protected]:~/Examples$ find -type f -name mystuff
./mystuff
Si vous souhaitez uniquement rechercher des répertoires, spécifiez le type -d :
find . -type d -name SEARCH_NAME
Dans le fichier précédent, recherchez uniquement les répertoires :
[email protected]:~/Examples$ find -type d -name mystuff
./new/mystuff
Exécuter une recherche insensible à la casse
Par défaut, la commande find est sensible à la casse. Vous pouvez exécuter une recherche insensible à la casse avec le nom donné en utilisant -iname
au lieu de -name
.
find . -type f -iname SEARCH_NAME
Vous pouvez l'utiliser avec type d
aussi.
[email protected]:~/Examples$ find -iname mystuff
./new/mystuff
./MyStuff
./mystuff
Capture d'écran des trois exemples ci-dessus :
Rechercher des fichiers par leur extension (important)
L'une des utilisations les plus courantes de la commande find consiste à rechercher des fichiers d'un type spécifique ou devrais-je dire d'une extension spécifique.
Par exemple, disons que vous souhaitez rechercher tous les fichiers C++ dans les répertoires actuels. Les fichiers C++ se terminent par l'extension .cpp, vous pouvez donc les rechercher comme ceci :
find . -type f -name "*.cpp"
De cette façon, vous dites à la commande find de rechercher type file
et avec des noms qui se terminent par .cpp
.
[email protected]:~$ find . -type f -name "*.cpp"
./file.cpp
./.cargo/registry/src/github.com-1ecc6299db9ec823/libz-sys-1.1.3/src/zlib/contrib/iostream2/zstream_test.cpp
./.cargo/registry/src/github.com-1ecc6299db9ec823/libz-sys-1.1.3/src/zlib/contrib/iostream/test.cpp
./.cargo/registry/src/github.com-1ecc6299db9ec823/libz-sys-1.1.3/src/zlib/contrib/iostream/zfstream.cpp
Placez toujours votre expression de recherche entre guillemets lorsque vous utilisez la commande de recherche. Pourquoi est-ce que je recommande d'utiliser des guillemets doubles ou des guillemets simples autour de votre terme de recherche ? Parce que si vous ne le faites pas, le shell développera le caractère générique.
Si vous ne placez pas votre terme de recherche entre guillemets :
find . -type f -name *.cpp
Votre shell développera *.cpp et le remplacera par tous les fichiers du répertoire courant dont les noms se terminent par .cpp.
Cela pourrait fonctionner s'il n'y a qu'un seul fichier, mais s'il y en a plusieurs, votre shell se plaindra d'une syntaxe incorrecte.
Dans l'exemple ci-dessus, il n'y a qu'un seul fichier cpp et donc lorsque la commande se développe en find . -type f -name file.cpp
, cela fonctionne car il file.cpp
fonctionne toujours comme terme de recherche.
Mais il y a deux fichiers .txt dans le même répertoire et donc lorsque la commande se développe en find . -type f -name another.txt new.txt
, il se plaint parce qu'il y a plus d'un terme de recherche maintenant.
C'est pourquoi vous devez toujours placer votre terme de recherche entre guillemets doubles.
Rechercher plusieurs fichiers avec plusieurs extensions (ou condition)
La commande ci-dessus a recherché des fichiers avec une extension donnée. Que faire si vous souhaitez rechercher des fichiers avec différentes extensions ?
Au lieu d'exécuter la commande find plusieurs fois, exécutez-la une fois en utilisant le -o
option qui fonctionne comme condition OU logique :
find . -type f -name "*.cpp" -o -name "*.txt"
Voici un exemple :
[email protected]:~/Examples$ find . -type f -name "*.txt" -o -name "*.cpp"
./new.txt
./file.cpp
./new/new.txt
./new/dir2/another.txt
./new/dir1/new.txt
./another.txt
Rechercher des fichiers dans un répertoire spécifique
Jusqu'à présent, tous les exemples ont effectué une recherche dans le répertoire en cours car vous avez spécifié . dans les exemples.
Le point peut être remplacé par un chemin absolu ou relatif d'un répertoire afin que vous puissiez rechercher des fichiers dans le répertoire spécifié sans quitter votre emplacement actuel.
[email protected]:~/Examples$ find ./new -name mystuff
./new/mystuff
Rechercher des fichiers dans plusieurs répertoires
Si vous pensez que le ou les fichiers souhaités pourraient se trouver à plusieurs endroits, vous n'avez pas besoin d'exécuter la commande de recherche plusieurs fois. Spécifiez simplement tous les chemins de répertoire à rechercher dans la commande find :
find ./location1 /second/location -type f -name "pattern"
Rechercher des fichiers et répertoires vides
Le -empty
L'option vous permet de rechercher des fichiers et des répertoires vides avec la commande find.
Pour trouver tous les fichiers et répertoires vides dans le répertoire courant, utilisez :
find . -empty
Vous pouvez spécifier le type de fichier pour rechercher uniquement les fichiers ou répertoires vides :
find . -empty -type f
Vous pouvez également la combiner avec la recherche par nom de fichier :
find . -empty -type f -name "*.cpp"
Rechercher des fichiers volumineux ou petits (Rechercher en fonction de la taille du fichier)
Vous pouvez trouver de gros fichiers ou de petits fichiers en fonction de la recherche effectuée par le paramètre de taille. Cela ne fonctionne qu'avec des fichiers, pas des répertoires.
Vous utilisez le -size
option avec +N pour taille supérieure à N et -N pour taille inférieure à N.
Trouver des fichiers d'exactement 50 Ko :
find . -size 50k
Pour rechercher des fichiers supérieurs à 1 Go dans le répertoire courant :
find . -size +1G
Pour trouver moins de 20 octets :
find . -size -20c
Pour rechercher des fichiers supérieurs à 100 Mo mais inférieurs à 2 Go :
find . -size +100M -size -2G
Vous pouvez également combiner la recherche par taille avec la recherche par nom. Par exemple, pour rechercher tous les fichiers dont le nom se termine par .log mais dont la taille est supérieure à 500 Mo dans le répertoire racine, vous pouvez utiliser :
find / -size +500M -name "*.log"
Pour rappeler :
c
:octetsk
:kilo-octetsM
:MégaoctetsG
:Gigaoctets
Rechercher les fichiers récemment modifiés (recherche basée sur l'heure de modification ou de création)
Vous connaissez le concept de mtime, atime et ctime, n'est-ce pas ?
- mtime :heure de la dernière modification du fichier
- ctime :heure de création du fichier
- atime :heure du dernier accès au fichier
Vous vous retrouverez souvent dans des situations où vous souhaitez trouver tous les fichiers récemment modifiés. La recherche par heure modifiée aide dans de tels cas.
Pour retrouver tous les fichiers modifiés sous 3 jours (3*24H), utilisez :
find . -type f -mtime -3
Pour retrouver tous les fichiers créés il y a au moins 5 jours (5*24H), utilisez :
find . -type f -ctime +5
Je sais que 24 heures c'est un laps de temps énorme. Que faire si vous souhaitez rechercher des fichiers qui ont été modifiés il y a seulement quelques minutes ? Pour cela, vous pouvez utiliser mmin
, amin
et cmin
.
Pour trouver tous les fichiers qui ont été modifiés au cours des 5 dernières minutes, utilisez :
find . -type f -mmin -5
Vous pouvez spécifier des limites supérieures et inférieures avec le nom de la recherche. La commande ci-dessous recherchera tous les fichiers .java qui ont été modifiés au cours des 20 à 30 dernières minutes.
find . -type f -mmin +20 -mmin -30 -name "*.java"
Rechercher des fichiers avec des autorisations de fichiers spécifiques
J'espère que vous connaissez le concept d'autorisation de fichier sous Linux.
La commande de recherche vous permet de rechercher des fichiers avec une autorisation de fichier et un mode d'accès spécifiques.
find -perm mode
Par exemple, pour trouver tous les fichiers en mode d'accès 777 dans le répertoire courant;
find . -perm 777
Pour trouver tous les fichiers avec un accès en lecture et en écriture pour tous (correspondance exacte, cela ne correspondra pas si le fichier a l'autorisation d'exécution pour tous) :
find . -perm a=r+w
Rechercher les fichiers appartenant à un utilisateur
Vous pouvez également rechercher des fichiers en fonction de leur propriété.
Par exemple, pour rechercher des fichiers appartenant à l'utilisateur John dans le répertoire courant, utilisez :
find . -type f -user John
Vous pouvez également le combiner avec d'autres options comme la taille, l'heure et le nom :
find . -type f -user John -name "*.cpp"
Ne pas rechercher récursivement, rechercher uniquement dans le répertoire courant
Par défaut, la commande find recherche dans tous les sous-répertoires de votre emplacement actuel. Si vous ne le souhaitez pas, vous pouvez spécifier la profondeur de votre recherche à 1. Cela limitera la recherche au seul répertoire actuel et exclura tous les sous-répertoires.
find . -maxdepth 1 -type f -name "*.txt"
Exclure un répertoire de la recherche
si vous souhaitez exclure un répertoire de la recherche, vous pouvez le faire en combinant chemin, élaguer et ou logique.
find . -path "./directory_exclude/*" -prune -o -name SEARCH_NAME
Attention au * dans le chemin du répertoire, -prune
après chemin et -o
après la taille.
Fondamentalement, la commande prune demande de ne pas utiliser la valeur spécifiée par path. Prune est toujours utilisé avec -o
pour s'assurer que le côté droit des termes est évalué uniquement pour les répertoires qui n'ont pas été élagués.
Intervenir sur le résultat des commandes de recherche (exec et xargs)
Jusqu'à présent, vous avez appris différentes manières de rechercher des fichiers en fonction de divers critères. C'est bon. Mais vous pouvez l'améliorer en effectuant certaines actions sur le résultat de la commande find.
Par exemple, que diriez-vous de trouver des fichiers correspondant à un certain modèle de nom et de les renommer tous en même temps ou de trouver des fichiers vides et de les supprimer ?
Vous savez que la redirection de canal peut être utilisée pour combiner la sortie d'une commande avec l'entrée d'une autre commande. Mais cela ne fonctionnera pas avec la sortie de la commande find, du moins pas directement.
Vous avez deux options si vous souhaitez effectuer une action sur le résultat de la commande find :
- Utiliser exec
- Utiliser xargs
Utilisation de la recherche et de l'exécution
Supposons que vous souhaitiez lister longuement (ls -l) les fichiers de recherche avec la commande find. Voici ce que vous utilisez :
find . -type f -name "*.txt" -exec ls -l {} +
Voici le résultat :
[email protected]:~/Examples$ find . -type f -name "*.txt" -exec ls -l {} +
-rw-rw-r-- 1 abhishek abhishek 39 Oct 13 19:30 ./another.txt
-rw-rw-r-- 1 abhishek abhishek 35 Oct 13 15:36 ./new/dir1/new.txt
-rw-rw-r-- 1 abhishek abhishek 35 Oct 13 15:36 ./new/dir2/another.txt
-rw-rw-r-- 1 abhishek abhishek 35 Oct 13 18:51 ./new/mystuff/new.txt
-rwxrwxrwx 1 abhishek abhishek 35 Oct 13 15:37 ./new/new.txt
-rw-rw-r-- 1 abhishek abhishek 35 Oct 13 18:16 ./new.txt
Beaucoup de gens oublient d'ajouter le {} +
à la fin de la commande exec. Vous devez l'utiliser et faire attention à l'espace entre {} et +.
Le {} est ce qui fait référence au résultat de la commande find. Vous pouvez l'imaginer comme {fichier 1, fichier 2, fichier 3}. Le +
sign est utilisé pour terminer la commande exec.
Il existe également une autre convention avec exec :
find . -type f -name *.txt" -exec ls -l {} \;
Ici,; est utilisé à la place du signe +. Le \ supplémentaire avant; est utilisé pour échapper le caractère spécial;.
L'avantage de {} +
est qu'il exécute moins de commandes que ls -l file1 file2 file3
alors que {} \;
exécutera ls -l file1
, ls -l file2
etc.
Mais, {} \;
a l'avantage d'utiliser {}
plusieurs fois dans la même instruction exec. Par exemple, la commande ci-dessous renommera tous les fichiers trouvés avec l'extension .old.
find . -type f -name *.txt" -exec mv {} {}.old \;
Utiliser xargs
De nombreux utilisateurs de Linux s'habituent à la redirection de canal. Cette commande exec avec la fin {} +
semble intimidant pour eux.
C'est là que xargs aide. Vous analysez simplement la sortie de la commande find vers la commande xargs via pipe.
find . -type f -name *.txt" | xargs ls -l
La syntaxe semble beaucoup plus simple, non ? La commande Xargs est également très puissante. Vous pouvez lire à ce sujet ici.
Combiner trouver et grep
Maintenant que vous savez comment combiner find avec xargs et la commande exec, vous pouvez l'utiliser pour combiner find et grep.
Pour tout administrateur système ou développeur de logiciels, trouver et grep est l'une des combinaisons les plus courantes et pourtant les plus utiles.
Vous recherchez des modèles de noms de fichiers avec find, puis utilisez grep pour rechercher le contenu à l'intérieur de ces fichiers.
Par exemple, vous souhaitez rechercher tous les fichiers .txt contenant le terme Alice. Vous combinez find et grep comme ceci :
find . -type f -name "*.txt" -exec grep -i alice {} +
La même chose peut également être obtenue avec xargs :
find . -type f -name "*.txt" | xargs grep -i alice
Bien sûr, c'est le plus simple des exemples, mais si vous connaissez la commande grep, vous pouvez l'utiliser à votre guise et selon vos besoins.
Il y a beaucoup plus avec find...
Et il n'est pas possible de lister toutes les options et exemples de la commande find. Les possibilités sont infinies, mais lorsque vous vous familiarisez avec la commande de recherche, vous pouvez commencer à l'utiliser dans diverses situations. C'est vraiment à vous de décider comment vous combinez la logique ici.
J'espère que vous trouverez ces exemples de commande find utiles. Si vous avez encore des questions ou des suggestions pour améliorer cet article, n'hésitez pas à me le faire savoir dans la section des commentaires.