Linux trouve les noms de fichiers avec une chaîne donnée

107

Je suis sous Ubuntu et j'aimerais trouver tous les fichiers du répertoire courant et des sous-répertoires dont le nom contient la chaîne "John". Je sais que cela greppeut correspondre au contenu des fichiers, mais je ne sais pas comment l'utiliser avec les noms de fichiers. Toute aide serait appréciée.

JJ Beck
la source

Réponses:

195

Utilisez la commande find ,

find . -type f -name "*John*"
Rich Adams
la source
1
Créer un script bash personnalisé avec #!/bin/bash if [ -z $1 ]; then echo "Error: Specify pattern for search"; else /usr/bin/find . -type f -name "*$1*"; fi vous permettrait de l'exécuter F search-stringcomme un raccourci parfait
Ilia Rostovtsev
@IliaRostovtsev - bien, mais ce [ -z "$1" ]serait un peu mieux.
Joe
@Joe Ah, c'est vrai. Vous voulez dire au cas où un chemin aurait des espaces? Mais ici, nous ne vérifions que l'existence d'un espace de 1 $ pour faire apparaître 2 $ et c'est tout. Vous voulez dire que c'est théoriquement mieux, non?
Ilia Rostovtsev
@IliaRostovtsev - En fait, j'avais tort. Si $ 1 est nul, alors le test devient if [ -z ]. Je pensais que ce serait une erreur de syntaxe, mais cela fonctionne. Je peux désormais simplifier une partie de mon code.
Joe
25

Une réponse correcte a déjà été fournie, mais pour que vous appreniez à vous aider vous-même, j'ai pensé ajouter quelque chose d'utile d'une manière différente; si vous pouvez résumer ce que vous essayez d'accomplir en un mot, il existe une puissante fonctionnalité d'aide sur Linux.

man -k <your search term>

Cela permet de répertorier toutes les commandes contenant votre terme de recherche dans la brève description. Il y a généralement de bonnes chances que vous trouviez ce que vous recherchez. ;)

Cette sortie peut parfois être un peu écrasante, et je recommanderais de la limiter aux exécutables, plutôt qu'à toutes les pages de manuel disponibles, comme ceci:

man -k find | egrep '\(1\)'

ou, si vous souhaitez également rechercher des commandes qui nécessitent des niveaux de privilèges plus élevés, comme ceci:

man -k find | egrep '\([18]\)'
tink
la source
3
Je suis curieux ... une question qui ne montre aucune tentative de résoudre le problème en question via une recherche obtient un vote positif, une explication amicale sur la façon de connaître les commandes possibles est piétinée. Quels sont les critères? :)
tink
1
Je vous ai voté. la leçon est rare. mais on peut voir des échantillons et s'adapter :)
tgkprog
2

La findcommande prendra beaucoup de temps car elle analyse les fichiers réels dans le système de fichiers.

Le moyen le plus rapide est d'utiliser la locatecommande, qui donnera immédiatement le résultat:

locate "John"

Si la commande n'est pas trouvée, vous devez d'abord installer le mlocatepackage et exécuter la updatedbcommande pour préparer la base de données de recherche pour la première fois.

Plus de détails ici: https://medium.com/@thucnc/the-fastest-way-to-find-files-by-filename-mlocate-locate-commands-55bf40b297ab

Thucnguyen
la source
1

utilisez ack c'est simple. tapez simplementack <string to be searched>

Annu
la source
Il semble que cela inclura également tous les chemins contenant le texte de recherche, pas seulement les fichiers: stackoverflow.com/questions/7698867/…
underscore_d
1

C'est une solution très simple en utilisant la treecommande dans le répertoire que vous souhaitez rechercher. -faffiche le chemin complet du fichier et |est utilisé pour diriger la sortie de l'arborescence vers greppour trouver le fichier contenant la chaîne filenamedans le nom.

tree -f | grep filename
caylus
la source