web-dev-qa-db-fra.com

Trouver des fichiers contenant un texte donné

En bash, je veux renvoyer le nom du fichier (et le chemin d'accès au fichier) pour chaque fichier de type .php|.html|.js contenant la chaîne ne respectant pas la casse "document.cookie" | "setcookie"

Comment je ferais ça?

142
Owen
egrep -ir --include=*.{php,html,js} "(document.cookie|setcookie)" .

L'indicateur r signifie effectuer une recherche récursive (sous-répertoires de recherche). Le drapeau i signifie non sensible à la casse.

Si vous voulez juste les noms de fichier, ajoutez l’indicateur l (minuscule L):

egrep -lir --include=*.{php,html,js} "(document.cookie|setcookie)" .
196
bear24rw

Essayez quelque chose comme grep -r -n -i --include="*.html *.php *.js" searchstrinhere .

le -i le rend insensible à la casse

le . à la fin signifie que vous voulez commencer à partir de votre répertoire actuel, cela pourrait être remplacé par n'importe quel répertoire.

le -r signifie le faire de manière récursive, tout au long de l'arborescence

le -n imprime le numéro de ligne pour les correspondances.

le --include vous permet d'ajouter des noms de fichiers, des extensions. Wildcards acceptés

Pour plus d'informations, voir: http://www.gnu.org/software/grep/

46
Raoul

find eux et grep pour la chaîne:

Ceci trouvera tous les fichiers de vos 3 types dans/starting/path et grep pour l'expression régulière '(document\.cookie|setcookie)'. Diviser sur 2 lignes avec la barre oblique inverse juste pour la lisibilité ...

find /starting/path -type f -name "*.php" -o -name "*.html" -o -name "*.js" | \
 xargs egrep -i '(document\.cookie|setcookie)'
14

Cela semble être un travail parfait pour grep ou peut-être ack

Ou cette magnifique construction:

find . -type f \( -name *.php -o -name *.html -o -name *.js \) -exec grep "document.cookie\|setcookie" /dev/null {} \;
9
Fredrik Pihl
find . -type f -name '*php' -o -name '*js' -o -name '*html' |\
xargs grep -liE 'document\.cookie|setcookie'
4
nos

Juste pour inclure une autre alternative, vous pouvez aussi utiliser ceci:

find "/starting/path" -type f -regextype posix-extended -regex "^.*\.(php|html|js)$" -exec grep -EH '(document\.cookie|setcookie)' {} \;

Où:

  • -regextype posix-extended dit à find à quel type de regex s'attendre
  • -regex "^.*\.(php|html|js)$" dit à find le nom du fichier de la regex lui-même doit correspondre
  • -exec grep -EH '(document\.cookie|setcookie)' {} \; indique à find d'exécuter la commande (avec ses options et arguments) spécifiée entre l'option -exec et le \; pour chaque fichier trouvé, où {} représente l'emplacement où le fichier chemin va dans cette commande.

    tandis que

    • L'option E indique à grep d'utiliser les expressions rationnelles étendues (pour prendre en charge les parenthèses) et ...
    • L'option H indique à grep d'imprimer les chemins de fichiers avant les correspondances.

Et, étant donné cela, si vous ne voulez que des chemins de fichiers, vous pouvez utiliser:

find "/starting/path" -type f -regextype posix-extended -regex "^.*\.(php|html|js)$" -exec grep -EH '(document\.cookie|setcookie)' {} \; | sed -r 's/(^.*):.*$/\1/' | sort -u

  • | [pipe] envoie la sortie de find à la commande suivante (ceci est sed, puis sort)
  • L'option r indique à sed d'utiliser l'expression régulière étendue.
  • s/HI/BYE/ indique à sed de remplacer chaque première occurrence (par ligne) de "HI" par "BYE" et ...
  • s/(^.*):.*$/\1/ lui dit de remplacer l'expression rationnelle (^.*):.*$ (ce qui signifie un groupe [élément entouré de ()] incluant tout [.* = un ou plusieurs caractères] de au début de la ligne [^] jusqu'à 'le premier': 'suivi de n'importe quoi jusqu'à' la fin de la ligne [$]) par le premier groupe [\1] de la regex remplacée.
  • u indique au tri de supprimer les entrées en double (prenez sort -u comme facultatif).

... Loin d'être la manière la plus élégante. Comme je l'ai dit, mon intention est d'élargir l'éventail des possibilités (et de donner des explications plus complètes sur certains outils que vous pourriez utiliser).

3
Pedro Vernetti