web-dev-qa-db-fra.com

Comment "grep" pour un nom de fichier au lieu du contenu d'un fichier?

grep est utilisé pour rechercher dans un fichier si une ligne correspond à une expression régulière donnée. Cependant, j'ai cette situation - je veux écrire une expression régulière qui correspondra au nom de fichier lui-même (et non au contenu du fichier). Je vais l'exécuter à partir du répertoire racine du système, pour rechercher tous les fichiers correspondant à l'expression régulière. 

Par exemple, si je veux trouver tous les fichiers de formulaire VB commençant par "f" et finissant par .frm, j'utilise l'expression régulière - 

   "f[[:alnum:]]*\.frm"

Grep peut-il le faire? Si non, existe-t-il un utilitaire qui me permettrait de le faire? Merci. 

114
CodeBlue

Vous devez utiliser find au lieu de grep dans ce cas.

Vous pouvez également utiliser find en combinaison avec grep ou egrep:

$ find | grep "f[[:alnum:]]\.frm"
102
Pablo Santa Cruz

Comme Pablo l’a dit, vous devez utiliser find au lieu de grep, mais il n’est pas nécessaire de raccorder find à grep. find a cette fonctionnalité intégrée dans:

find . -regex 'f[[:alnum:]]\.frm'

find est un programme très puissant permettant de rechercher des fichiers par nom. Il prend en charge la recherche par type de fichier, la limitation de la profondeur, la combinaison de différents termes de recherche avec des opérations booléennes et l’exécution de commandes arbitraires sur les fichiers trouvés. Voir la page de manuel de recherche pour plus d’informations.

41
whereswalden

Exemple

find <path> -name *FileName*

Du manuel:

_ {trouver le modèle de nom)

La base du nom de fichier (le chemin avec les répertoires principaux supprimés) correspond au modèle de masque Shell . Puisque les répertoires principaux sont supprimés, les noms de fichiers pris en compte pour une correspondance avec -name ne seront jamais Inclure une barre oblique, donc "- name a/b "ne correspondra jamais à rien (vous aurez probablement besoin d'utiliser -path à la place). Les métacaractères .__ ("*", "?" Et "[]") correspondent à un "." au début du nom de la base (il s'agit d'un changement dans find ‐ utils-4.2.2; voir la section CONFORMANCES SUR LES NORMES, ci-dessous). Pour ignorer un répertoire et les fichiers qu'il contient, Utilisez -Prune; voir un exemple dans la description de -path. Les accolades ne sont pas reconnues comme étant spéciales, bien que certains shells, y compris Bash imbue, aient une signification spéciale dans les motifs de shell . La correspondance du nom de fichier est effectuée à l’aide de la fonction de bibliothèque fnmatch (3). N'oubliez pas de mettre le motif entre guillemets pour le protéger de l'expansion par le shell.

27
javaPlease42
find -iname "file_name"

Syntax :-
find -type type_descriptor file_name_here

types_descriptor: -

f: fichier normal

d: répertoire

l: lien symbolique

c: dispositifs de caractère

b: bloquer les périphériques

11
Sireesh Yarlagadda

Vous pouvez trouver le chemin complet d'un fichier en utilisant grep, il suffit de diriger la sortie de tree

tree -f | grep filename

Voici une fonction que vous pouvez mettre dans votre .bash_profile ou .bashrc

findfile(){ tree -f | grep $1; } # $1 = filename, -f is full path
11
jasonleonhard

Vous pouvez aussi faire:

tree | grep filename

Ceci dirige la sortie de la commande tree vers grep pour une recherche. Cela vous indiquera seulement si le fichier existe bien.

5
caylus

Non, grep fonctionne très bien pour cela:

 grep -rl "filename" [starting point]

 grep -rL "not in filename"
0
R M

Aussi pour plusieurs fichiers.

tree /path/to/directory/ | grep -i "file1 \| file2 \| file3"
0
DimiDak