Rechercher des fichiers contenant un texte donné

Dans bash je veux retourner le nom du fichier (et le chemin du fichier) pour chaque fichier de type .php|.html|.js contenant la chaîne insensible à la casse "document.cookie" | "setcookie" "document.cookie" | "setcookie"

Comment pourrais-je faire ça?

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

Si vous voulez juste des noms de fichiers, ajoutez le flag l (minuscule):

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

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

le -i le rend insensible à la casse

la “.” à 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 récursivement, tout au long de l’arborescence

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

le “–include” vous permet d’append des noms de fichiers, des extensions. Wildcards acceptés

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

find les et grep pour la chaîne:

Cela trouvera tous les fichiers de vos 3 types dans / startup / path et grep pour l’expression régulière '(document\.cookie|setcookie)' . Divisez sur 2 lignes avec la barre oblique inversée juste pour la lisibilité …

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

Sonne comme 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 {} \; 
 find . -type f -name '*php' -o -name '*js' -o -name '*html' |\ xargs grep -liE 'document\.cookie|setcookie' 

Juste pour inclure une autre alternative, vous pouvez également 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 attendre
  • -regex "^.*\.(php|html|js)$" dit find la regex elle-même
  • -exec grep -EH '(document\.cookie|setcookie)' {} \; indique find pour exécuter la commande (avec ses options et ses arguments) spécifiée entre l’option -exec et la commande \; pour chaque fichier trouvé, où {} représente l’emplacement du chemin d’access au fichier dans cette commande.

    tandis que

    • E option E indique à grep d’utiliser une expression rationnelle étendue (pour prendre en charge les parenthèses) et …
    • H option H indique à grep d’imprimer les chemins d’access aux fichiers avant les correspondances.

Et, étant donné que 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 (qui est sed , puis sort )
  • r option r indique à sed d’utiliser une expression rationnelle étendue.
  • s/HI/BYE/ indique à sed de remplacer chaque première occurrence (par ligne) de “HI” par “BYE” et …
  • s/(^.*):.*$/\1/ dit de remplacer le regex (^.*):.*$ :. (^.*):.*$ (c’est-à-dire un groupe [stuff entre () ] incluant tout [ .* = un ou plusieurs de tout caractère] depuis le début de la ligne [ ^ ] jusqu’à ‘le premier’: ‘suivi de tout jusqu’à la fin de la ligne [ $ ]) par le premier groupe [ \1 ] du regex remplacé.
  • u dit à sortinger pour supprimer les entrées en double (prendre en sort -u comme facultatif).

… FAR d’être la manière la plus élégante. Comme je l’ai dit, mon intention est d’augmenter la gamme des possibilités (et aussi de donner des explications plus complètes sur certains outils que vous pourriez utiliser).