web-dev-qa-db-fra.com

grep récursivement pour des fichiers spécifiques

J'ai essayé d'utiliser grep pour trouver des extraits de code dans des fichiers python répartis sur des répertoires/sous-répertoires. Malheureusement, mes tentatives ont échoué :(

J'ai pensé:

grep -r "search-pattern" *.py

devrait faire la magie, mais il a échoué avec "aucune correspondance trouvée", bien qu'il existe plusieurs fichiers contenant des lignes avec le modèle de recherche.

Ensuite, j'ai essayé ce qui suit:

grep -r "search-pattern" .

Ce qui a semblé fonctionner, mais a aussi renvoyé de nombreuses erreurs pour certains fichiers c compilés. Évidemment plus que je voulais.

Enfin, après plusieurs recherches sur Google, j'ai trouvé:

grep -rn --include="*.py" "search-pattern"

Cela a permis de trouver tous les fichiers python que je cherchais. En prime, il imprime également les numéros de ligne contenant le motif de recherche.

Mais il restait un problème: certaines erreurs "autorisation refusée". Comment puis-je m'en débarrasser? Je pensais que manipuler grep serait facile, mais il s’est avéré complexe d’obtenir de bons résultats, avec numérotation des lignes et sans erreur.

Toute aide serait très appréciée :)

4
daniel451

Vous obtenez ces erreurs Permission denied parce qu'il existe certains fichiers python que votre utilisateur n'a pas l'autorisation de lire, donc grep est pas travaillant pour ces fichiers (vous ne pouvez pas les rechercher).

Vous voulez "vous débarrasser" des erreurs Permission denied.

  1. Vous pouvez ajouter 2>/dev/null à la fin de votre commande comme ceci:

    grep -rn --include="*.py" "search-pattern" 2>/dev/null
    

    Ceci supprime tous les messages d'erreur, vous ne verrez donc pas les erreurs Permission denied apparaître. Mais cela signifie évidemment que grep ne cherche pas dans ces fichiers. Par conséquent, s'ils contiennent votre motif de recherche, vous ne les verrez pas dans le résultat.

    Explication :
    Sous Linux, il existe trois choses appelées descripteurs de fichier : stdin, stdout, stderr. Si vous exécutez une commande et qu'elle vous renvoie une erreur, l'erreur est écrite dans le descripteur de fichier stderr. Par défaut, stderr renvoie les erreurs au terminal. Donc, ce que nous pouvons faire, c’est rediriger les erreurs, c’est-à-dire que nous redirigeons stderr ailleurs au lieu du terminal. Nous redirigeons les choses sous Linux en utilisant le signe >. Alors, où allons-nous rediriger stderr? Pour /dev/null. /dev/null est un fichier spécial; Pensez-y comme un trou noir. Tout ce que vous redirigez est jeté. Enfin, nous appelons stderr simplement le nombre 2. Donc, 2>/dev/null indique à Linux de rediriger 2 vers /dev/null. 1 signifie stdout (qui est la sortie normale d'une commande, c'est-à-dire pas des erreurs). Ainsi, par exemple, si vous souhaitez enregistrer la sortie réelle de votre commande grep dans un fichier plutôt que de l'afficher dans le terminal, vous pouvez utiliser 1>/path/to/filename, qui redirigera stdout vers ce fichier.

  2. Utilisez Sudo avec votre commande, en supposant que vous ayez les privilèges:

    Sudo grep -rn --include="*.py" "search-pattern"
    

    Si votre nom d'utilisateur dispose des privilèges root (c'est-à-dire si vous êtes administrateur de la machine), utilisez Sudo avant qu'une commande ne l'exécute en tant qu'utilisateur root. Ainsi, vous n'obtiendrez jamais les erreurs Permission denied et grep va rechercher ces fichiers et afficher le motif de recherche s'il le trouve à l'intérieur.

3
Alaa Ali

C'est un problème courant, vous pouvez le résoudre directement en ligne de commande.
Vous pouvez utiliser --devices=skip pour ignorer les fichiers de périphérique spéciaux (source d’erreurs et de boucles sans fin sur de nombreux systèmes).
Exécutez Sudo chown -R new_owner_name file_pattern pour modifier la propriété du fichier de manière récursive et éviter les erreurs d'autorisation.
Si vous redirigez le flux d’erreurs avec COMMAND 2> DESTINATION_OR_/dev/null, les erreurs se produisent toujours et vous n’obtiendrez pas les résultats souhaités de grep.
Si possible, n'utilisez jamais Sudo automatiquement pour effectuer l'analyse (il peut s'agir d'un point faible du système), essayez de modifier la propriété du fichier si nécessaire. Une version graphique de Sudo est disponible si vous devez demander une autorisation à l'utilisateur.

S'il vous plaît, n'hésitez pas à commenter sous ici si vous avez plus de questions inhérentes et n'oubliez pas d'appuyer sur la flèche vers le haut HAUT si je suis d'aucune aide.
Bonne journée.

1
Lorenzo Ancora