5 votes

grep récursivement pour des fichiers spécifiques

J'ai essayé d'utiliser grep pour trouver des extraits de code dans des fichiers Python qui sont répartis dans plusieurs répertoires/sous-répertoires, mais 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 y ait plusieurs fichiers contenant des lignes avec le motif de recherche.

J'ai ensuite essayé ce qui suit :

grep -r "search-pattern" .

Ce qui semblait fonctionner, mais renvoyait aussi de nombreuses erreurs pour certains fichiers c compilés et autres. Évidemment plus que ce que je voulais.

Enfin Après de nombreuses recherches sur Google, je suis arrivé à ce résultat :

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

Cela a fait le travail et a trouvé tous les fichiers Python que je cherchais. En bonus, elle affiche également les numéros de ligne contenant le modèle de recherche.

Mais un problème subsistait : des erreurs "permission denied". Comment puis-je m'en débarrasser ? Je pensais que la manipulation de grep serait facile mais il s'est avéré être complexe pour obtenir des résultats agréables, avec numérotation des lignes et sans erreurs .

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

4voto

Alaa Ali Points 29075

Vous obtenez ces Permission denied car il y a certains fichiers Python que votre utilisateur n'a pas le droit de lire, donc grep est no travailler pour ces fichiers (vous ne pouvez pas les rechercher).

Vous voulez vous "débarrasser" de la Permission denied erreurs.

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

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

    Cela supprime tous les messages d'erreur, et vous ne verrez donc pas l'icône Permission denied des erreurs apparaissant. Mais cela signifie évidemment que grep ne cherche pas ces fichiers, donc s'ils contiennent votre motif de recherche, vous ne les verrez pas dans la sortie.

    Explication :
    Dans Linux, il y a trois choses appelées descripteurs de fichiers : stdin , stdout , stderr . Si vous exécutez une commande et qu'elle vous donne une erreur, cette erreur est écrite dans le descripteur de fichier. stderr . Par défaut, stderr sort les erreurs sur le terminal. Donc ce que nous pouvons faire est de rediriger les erreurs, c'est à dire que nous redirigeons stderr ailleurs au lieu du terminal. Nous redirigeons les choses sous Linux en utilisant la fonction > signe. Alors, où allons-nous rediriger stderr ? A /dev/null . /dev/null est un fichier spécial ; pensez-y comme à un trou noir. Tout ce que vous y redirigez sera jeté. Enfin, nous faisons référence à stderr comme étant simplement le nombre 2 . Donc 2>/dev/null dit à Linux de rediriger 2 a /dev/null . 1 signifie stdout (qui est la sortie normale d'une commande, c'est-à-dire sans erreur). Ainsi, par exemple, si vous voulez 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 à ce fichier.

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

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

    Si votre nom d'utilisateur a les privilèges de l'administrateur (c'est-à-dire si vous êtes un administrateur de la machine), l'utilisation de la fonction sudo avant qu'une commande ne soit exécutée en tant qu'utilisateur root, ce qui fait que vous n'obtiendrez jamais l'adresse de l'utilisateur root. Permission denied erreurs et grep 意志 recherche ces fichiers et affiche le motif de recherche s'il le trouve.

1voto

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ériques spéciaux (source d'erreurs et de boucles sans fin sur de nombreux systèmes).
Exécuter sudo chown -R new_owner_name file_pattern pour changer la propriété du fichier de façon récursive et éviter les erreurs de permission.
Si vous redirigez le flux d'erreur 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 faire l'analyse (il peut s'agir d'un point faible du système), essayez de changer la propriété du fichier si nécessaire. Une version graphique de sudo est disponible si vous avez besoin de demander une permission à l'utilisateur.

N'hésitez pas à commenter ici si vous avez des questions plus inhérentes et n'oubliez pas d'appuyer sur la flèche UP de gauche si je peux vous aider.
Passez une bonne journée.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X