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 :)
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
.
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 fichierstderr
. 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 redirigeonsstderr
ailleurs au lieu du terminal. Nous redirigeons les choses sous Linux en utilisant le signe>
. Alors, où allons-nous redirigerstderr
? 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 appelonsstderr
simplement le nombre2
. Donc,2>/dev/null
indique à Linux de rediriger2
vers/dev/null
.1
signifiestdout
(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 utiliser1>/path/to/filename
, qui redirigerastdout
vers ce fichier.
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.
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.