web-dev-qa-db-fra.com

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

Dites 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 à l’aide de searchtag bat?

29
srk_cb

Recherche de fichiers avec batAnywhere

Pour trouver tous les fichiers n'importe où dans /path/to/folder dont les noms contiennent batname__, vous pouvez utiliser:

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

J'ai entre guillemets le modèle de recherche *bat* car, si les guillemets ont été omis et que les fichiers correspondent à *bat* dans le répertoire en cours, le shell va développer *bat* dans une liste et transmettre to findname__. Alors, findne fonctionnerait pas correctement. (\*bat\* et "*bat*" fonctionnent également.)

Pour effectuer une recherche dans le dossier dans lequel vous vous trouvez (par exemple, cdname__ed), utilisez ., comme d'habitude:

find . -name '*bat*'

Pour effectuer une recherche dans l’ensemble de votre ordinateur, tilisez / . Pour rechercher votre répertoire de base, utilisez ~ ou le nom complet de votre répertoire de base. ( Le shell étend ~ au chemin complet de votre répertoire personnel.)

Élargir ou restreindre votre recherche, en fonction du nom

Si vous souhaitez effectuer une recherche sans distinction de casse, afin que les fichiers contenant BATname__, bAtet ainsi de suite correspondent, utilisez le test -iname à la place du test -name:

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

J'ai remarqué que tous vos fichiers se terminent par .c. Si vous voulez seulement trouver des fichiers comme ça, utilisez:

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

J'ai remarqué que tous vos noms de fichier ont batsoit au tout début, soit à la fin de la partie précédant le suffixe .c. Si vous souhaitez éviter de faire correspondre les fichiers tels que embattled.c, vous pouvez utiliser:

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

-o est l'opérateur ou .

Correspondant seulement aux fichiers

Pour rechercher uniquement 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 souvent recommandé et parfois tout à fait approprié ... mais n'est souvent pas ce que vous voulez vraiment , surtout si vous exécutez finddans le but d'examiner la sortie toi-même. Si vous aviez n lien symbolique correspondant à votre recherche, ne voudriez-vous pas en savoir plus?

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

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

Cela utilise l'opérateur -o ainsi que des parenthèses pour le regroupement (ce qui doit être indiqué de manière à ce que le shell ne les traite pas spécialement, sinon vous obtiendrez une erreur de syntaxe).

Mais supposons que vous souhaitiez uniquement voir des liens symboliques qui pointent vers un fichier normal (et non des liens symboliques vers des répertoires, des nœuds de périphérique, etc.). En fait, c'est encore plus simple: utilisez -xtype au lieu de -type. Si vous n'exécutez pas findavec -L flag, -xtype sur un lien symbolique teste le type du fichier vers lequel le lien pointe.

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

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

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

Obtenir des résultats détaillés

L'action par défaut de findname __ si vous n'en spécifiez pas est -print. Toutes les commandes données ci-dessus sont équivalentes à elles-mêmes, avec -print ajouté à la fin.

findest souvent utilisé pour exécuter des commandes en fonction des fichiers trouvés, souvent des commandes qui apportent des modifications. Mais il existe également d'autres actions ayant pour but d'afficher les résultats, outre -print. -ls:

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

Cela donne des informations détaillées sur chaque fichier, dans un format multi-colonnes, similaire à ce que vous verriez si vous exécutiez ls file (quoique pas tout à fait pareil).

Lectures supplémentaires

Pour plus d'informations sur findet d'autres moyens de rechercher des fichiers, voir:

44
Eliah Kagan

Le plus simple est de courir

locate bat

De cette façon, vous pouvez rechercher dans l’ensemble de 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.

16
Mark Kirby

Ouvrez le terminal et changez de répertoire en répertoire à partir duquel vous souhaitez lancer la recherche, puis exécutez la commande suivante:

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

. lance la commande de recherche à partir du répertoire en cours.
Le -name correspond à la chaîne bat et est sensible à la casse. (-iname est insensible à la casse)
Le -type f recherche uniquement les fichiers.

14
karel

Si les fichiers sont dans le répertoire en cours, 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 ces 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
6
chaos

Vous souhaitez utiliser la commande find, avec l'option -iname pour la correspondance de noms de fichier ne respectant pas la casse, ou l'option -name pour les correspondances de noms de fichiers sensibles à la casse. Ces deux vous permettront d'utiliser des noms génériques. Donc, pour trouver les noms de fichiers contenant "bat", utilisez:

find / -iname '*bat*'

Ou

find / -name '*bat*'

* signifie "tout caractère (s)", la recherche recherche donc bat avec tous les caractères, y compris aucun, avant ou après. Le / effectue une recherche récursive à partir du répertoire racine. Vous pouvez utiliser . qui effectuera une recherche récursive dans le répertoire actuel ou le chemin absolu vers lequel vous souhaitez effectuer la recherche. Jetez un oeil à comment rechercher des fichiers en utilisant regex dans un script shell linux

4
AJefferiss

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.
2
A.B.