Comment grep rechercher des noms de fichiers au lieu de contenu sous Linux
grep
est un outil Linux généralement utilisé pour rechercher des fichiers texte pour un contenu spécifique. Cependant, il est souvent utile de rechercher des répertoires pour les noms de fichiers au lieu du contenu des fichiers, et cela peut être fait avec grep
et d’autres utilitaires de ligne de commande Linux
Utiliser find au lieu de grep
La grep
L’utilitaire prend essentiellement une entrée de chaîne à partir de fichiers ou d’une entrée standard et utilise des modèles ou Regex pour effectuer une recherche et imprimer les lignes correspondantes.
Vous pouvez techniquement utiliser grep
par lui-même pour rechercher des noms de fichiers au lieu de contenu, mais c’est uniquement parce que Linux autorise les caractères génériques dans les entrées de noms de fichiers. Cependant, vous pouvez tout aussi facilement utiliser ls
pour lister les fichiers de cette façon, ou utiliser des caractères génériques dans toute autre commande, et ce n’est pas une vraie solution pour rechercher des noms de fichiers comme comment grep
recherche le contenu.
grep "" ./file* -l
La vraie solution est d’utiliser le find
, qui peut rechercher dans les sous-répertoires et fournit le moyen le plus résistant de rechercher des fichiers car il interagit directement avec le système de fichiers. Il s’agit de l’utilitaire le plus couramment utilisé pour rechercher dans les répertoires, et il propose de nombreuses options, notamment la correspondance de modèles et la prise en charge des expressions régulières.
L’utilisation la plus basique consiste à utiliser find
seul pour imprimer une liste de fichiers, y compris les sous-répertoires, et transmettre cette entrée à grep
. Si vous avez déjà des scripts utilisant grep
il sera assez facile de les convertir en correspondance de cette façon.
find | grep "file"
Vous pouvez également utiliser des modèles directement avec find
éliminant le besoin de grep
. Utilisation -iname
avec une entrée.
find . -iname 'file_*.txt'
Contrairement à grep
Cependant, le find
La commande est un peu plus stricte – vous devez utiliser des guillemets simples ou doubles pour échapper à la chaîne de recherche, et vous devez utiliser des caractères génériques pour correspondre à la chaîne entière. Trouver simplement une sous-chaîne dans le nom n’est pas possible sans utiliser des caractères génériques pour faire correspondre le reste du nom.
Utilisation d’expressions régulières (Regex) avec find
Vous pouvez également utiliser des expressions régulières avec find
qui permet une correspondance beaucoup plus avancée :
find . -regex './file.*'
Cette expression régulière correspondra à tous les fichiers du répertoire actuel commençant par « fichier ». Cependant, il est important de savoir que cela fonctionne différemment de -iname
; l’entrée inclut le chemin d’accès complet au répertoire et doit utiliser ./
pour échapper au chemin relatif, ./
.
Cette commande montrée ici exclut le ./subdirectory/
dossier, car il ne commence pas par « fichier ». Pour résoudre ce problème, vous devez faire correspondre tout ce qui précède la barre oblique finale avec .*/
:
find . -regex '.*/file.*'
Les expressions régulières sont très compliquées, mais très puissantes. Si vous souhaitez en savoir plus, vous pouvez lire notre guide sur leur fonctionnement.