commande pour rechercher des fichiers en recherchant seulement une partie de leurs noms?

32

Disons qu'il y a des fichiers avec des noms:

batman.c
debate.c
cricketbat.c

Quelle commande et comment dois-je l'utiliser pour répertorier tous ces fichiers en utilisant la balise de recherche bat?

srk_cb
la source
5
Voulez-vous répertorier les fichiers correspondants uniquement dans le répertoire actuel? dans n'importe quel répertoire au niveau ou en dessous du répertoire actuel? n'importe où sur le système?
steeldriver

Réponses:

47

Trouver des fichiers avec batn'importe où

Pour trouver tous les fichiers n'importe où à l'intérieur /path/to/folderdont les noms contiennent bat, vous pouvez utiliser:

find /path/to/folder -name '*bat*'

J'ai cité le modèle de recherche *bat*parce que, si les citations ont été omis et les fichiers correspondent *bat*dans le répertoire courant, la coquille se développera *bat*dans une liste d'entre eux et passer que pour find. ensuitefind ça ne marcherait pas bien. ( \*bat\*et "*bat*"aussi travailler.)

Pour rechercher dans le dossier dans lequel vous vous trouvez actuellement (par exemple, dans lequel vous avez cdédité), utilisez ., comme d'habitude:

find . -name '*bat*'

Pour rechercher l'ensemble de votre ordinateur, utilisez/ . Pour rechercher votre répertoire personnel, utilisez ~ou le nom complet de votre répertoire personnel. ( Le shell se développe~ sur le chemin d'accès complet de votre répertoire personnel.)

Élargir ou restreindre votre recherche, en fonction du nom

Si vous souhaitez effectuer une recherche sans tenir compte de la casse, afin que les fichiers contenant BAT, bAtet ainsi de suite soient mis en correspondance, utilisez le -inametest au lieu du -nametest:

find /path/to/folder -iname '*bat*'

J'ai remarqué que tous vos fichiers se terminent .c. Si vous souhaitez uniquement rechercher des fichiers comme celui-ci, utilisez:

find /path/to/folder -name '*bat*.c'

J'ai remarqué que tous vos noms de fichiers se trouvent batau tout début ou à la fin de la partie précédant le .csuffixe. Si vous voulez éviter de faire correspondre des fichiers comme embattled.c, vous pouvez utiliser:

find /path/to/folder -name '*bat.c' -o -name 'bat*.c'

-oest l' opérateur or .

Correspondance uniquement avec les fichiers

Pour rechercher uniquement des fichiers normaux - et non des dossiers, des liens symboliques et des nœuds de périphérique spéciaux - vous pouvez utiliser -type f. Ceci est fréquemment recommandé et parfois tout à fait approprié ... mais souvent pas ce que vous voulez vraiment , surtout si vous exécutez finddans le but d'examiner la sortie vous-même. Si vous aviez un lien symbolique correspondant à votre recherche, ne voudriez-vous pas le savoir?

Si vous souhaitez trouver à la fois des fichiers normaux et des liens symboliques, vous pouvez utiliser:

find /path/to/folder -name '*bat*' \( -type f -o -type l \)

Qui utilise le -o opérateur et également des parenthèses pour le regroupement (qui doit être cité pour que le shell ne les traite pas spécialement; sinon vous obtiendrez une erreur de syntaxe).

Mais supposons que vous ne souhaitiez voir que des liens symboliques qui pointent finalement vers un fichier normal (et non des liens symboliques vers des répertoires, des nœuds de périphérique, etc.). C'est en fait encore plus simple: utilisez -xtypeplutôt que -type. Pourvu que vous n'êtes pas en cours d' exécution findavec le -Ldrapeau, -xtypesur un lien symbolique teste le type du fichier les points de lien vers.

find /path/to/folder -name '*bat*' -xtype f

Si vous avez un lien symbolique vers un autre lien symbolique vers un fichier, -xtype fil correspondra même si sa cible directe est un autre lien symbolique plutôt qu'un fichier normal. C'est presque toujours ce que vous voulez.

Souvent, les gens pensent qu'ils veulent -type f, mais vraiment ils le veulent -xtype f.

Obtenir une sortie détaillée

findl'action par défaut si vous n'en spécifiez pas une -print. Toutes les commandes données ci-dessus sont équivalentes à elles-mêmes avec-print à la fin.

findest souvent utilisé pour exécuter des commandes basées sur les fichiers trouvés - souvent, des commandes qui apportent des modifications. Mais il existe également d'autres actions dont le but est d'afficher les résultats -print. Un intérêt particulier est -ls:

find /path/to/folder -name '*bat*' -ls

Cela donne des informations détaillées sur chaque fichier, dans un format multi-colonnes, similaire (mais pas tout à fait le même que) ce que vous verriez en exécutant .ls file

Lectures complémentaires

Pour plus d'informations sur findet d'autres façons de rechercher des fichiers, voir:

Eliah Kagan
la source
1
Excellente réponse, en particulier les -xtypeconseils; peut ls *bat*- être et -maxdepth/ mindepthméritent également d'être mentionnés.
mklement0
2
@ mklement0 Merci! L'OP n'a pas encore fourni des éclaircissements sur l' endroit où les fichiers sont et si oui ou non récursivité est nécessaire. Comme la réponse du chaos l'als déjà couvert , je me suis concentré sur le cas récursif findici. Bien sûr, une réponse détaillée couvrant la liste non (ou moins) récursive des noms de fichiers correspondant à un modèle ( lset findavec -maxdepth) serait également utile. Vous voudrez peut-être publier une telle réponse!
Eliah Kagan
16

La façon la plus simple est de courir

locate bat

De cette façon, vous pouvez rechercher dans tout l'ordinateur des fichiers contenant "bat" dans le nom du fichier

Pour actualiser la liste des fichiers sur votre PC, exécutez

updatedb

Exécutez cette commande lorsque vous avez récemment ajouté de nouveaux fichiers à votre compte

Mark Kirby
la source
1
besoinsupdatetdb
Sergiy Kolodyazhnyy
4
@Serg Pour trouver de nouveaux fichiers (plus récents que la dernière updatedbexécution manuelle ou automatique de la dernière fois ), sudo updatedbil faudrait d'abord l'exécuter, oui.
Eliah Kagan
Notez que cela recherchera l'ensemble du système pour les noms correspondant bat.
terdon
1
@terdon Je l'ai déjà dit dans la réponse, ne pense pas que cela méritait le vote négatif quand je l'ai déjà dit.
Mark Kirby
1
Notez que cela est BEAUCOUP plus rapide que find /lors de locaterecherches dans une base de données, tout en findrépertoriant récursivement /puis en faisant correspondre l'expression régulière.
Timothy Gu
14

Ouvrez le terminal et modifiez les répertoires dans le répertoire à partir duquel vous souhaitez commencer la recherche, puis exécutez cette commande:

find . -name "*bat*" -type f 

La .commence la commande find du répertoire courant.
Le -namecorrespond à la chaîne batet est sensible à la casse. ( -inameEst sensible à la casse)
Les -type frecherches pour les fichiers.

Karel
la source
supprimer et restaurer? ok +1: P;)
AB
6

Si les fichiers se trouvent dans le répertoire courant, utilisez:

$ ls *bat*
batgirl.c  batman.c  batwoman.c  cricketbat.c

Ou (pour les avoir ligne par ligne):

$ ls -1 *bat*
batgirl.c
batman.c
batwoman.c
cricketbat.c

Si vous souhaitez rechercher les fichiers dans le système, utilisez:

$ find / -name "*bat*"
/path/to/cricketbat.c
/path/to/batgirl.c
/path/to/batwoman.c
/path/to/batman.c
le chaos
la source
1
Si votre recherche commence par le répertoire racine, vous voudrez peut-être ajouter sudo, car cette commande signalera «Autorisation refusée» pour certains dossiers
Sergiy Kolodyazhnyy
4

Vous souhaitez utiliser la findcommande, avec l' -inameoption de correspondance de nom de fichier insensible à la casse, ou l' -nameoption de correspondance de nom de fichier sensible à la casse. Ces deux options vous permettront d'utiliser des noms génériques. Donc, pour trouver les noms de fichiers contenant "bat", vous devez utiliser:

find / -iname '*bat*'

Ou

find / -name '*bat*'

Le *signifie "n'importe quel caractère (s)", donc la recherche recherche batavec tous les caractères, y compris aucun, avant ou après. Les /recherches à partir du répertoire racine de manière récursive, vous pouvez utiliser celle .qui recherchera récursivement à partir du répertoire actuel, ou le chemin absolu d'où vous souhaitez rechercher. Jetez un oeil à la façon dont la recherche de fichiers à l'aide de regex dans le script shell linux

AJefferiss
la source
@EliahKagan merci, j'ai ajouté plus d'informations à ma réponse.
AJefferiss
+1 Merci pour la modification. L'OMI est une force de cette réponse dont elle évite de recommander l'utilisation aveugle -type f, qui fait plus que simplement exclure les répertoires et n'est souvent pas ce que les utilisateurs veulent vraiment .
Eliah Kagan
2

Utilisez le bon vieux find.

find <path_for_search> -type f -iname "*bat*" 

par exemple.:

% find . -type f -iname "*bat*" 
./batgirl.c
./batwoman.c
./cricketbat.c
./batman.c

de man find:

-type c
          File is of type c:
          [..]
          d      directory
          [..]
          f      regular file
          [..]

-iname pattern 
          Like -name, but the match is case insensitive.
UN B
la source