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"
Comment pourrais-je faire ça?
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"
Comment pourrais-je faire ça?
Réponses:
egrep -ir --include=*.{php,html,js} "(document.cookie|setcookie)" .
Le r
drapeau signifie une recherche récursive (recherche dans les sous-répertoires). Le i
drapeau signifie insensible à la casse.
Si vous voulez juste des noms de fichiers, ajoutez l' indicateur l
(minuscules L
):
egrep -lir --include=*.{php,html,js} "(document.cookie|setcookie)" .
grep -E ...
>egrep ...
grep: (error|fail): No such file or directory
sur Ubuntu Desktop 16; des indices?
--include=\*.{php,html,js}
Essayez quelque chose comme grep -r -n -i --include="*.html *.php *.js" searchstrinhere .
le -i
rend insensible à la casse
le .
à la fin signifie que vous voulez commencer à partir de votre répertoire actuel, cela peut être remplacé par n'importe quel répertoire.
les -r
moyens le font de manière récursive, dans l'arborescence des répertoires
le -n
imprime le numéro de ligne pour les correspondances.
le --include
vous permet d'ajouter des noms de fichiers, des extensions. Caractères génériques acceptés
Pour plus d'informations, voir: http://www.gnu.org/software/grep/
-l
option (simplement imprimer les noms de fichiers qui correspondent) au lieu de-n
find
eux et grep
pour la chaîne:
Cela trouvera tous les fichiers de vos 3 types dans / starting / path et grep pour l'expression régulière '(document\.cookie|setcookie)'
. Divisez 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)'
-exec grep -l 'sth' {} \;
# egrep -ir --include=file.foo "(foo|bar)" /dir
sur un répertoire de poids ~ 500 Go .
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 {} \;
-exec grep...
est meilleure que ma xargs
méthode car elle ne s'étouffera pas avec les espaces dans les noms de fichiers.
find . -type f -print0 | xargs -0 -I {} grep "search_string" {}
. Bien sûr, les autres options peuvent également être ajoutées.
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
indique à find
quel type de regex s'attendre-regex "^.*\.(php|html|js)$"
indique à find
l'expression régulière elle-même que les noms de fichiers doivent correspondre-exec grep -EH '(document\.cookie|setcookie)' {} \;
dit find
d'exécuter la commande (avec ses options et arguments) spécifiée entre l' -exec
option et le \;
pour chaque fichier qu'il trouve, où {}
représente l'emplacement du chemin du fichier dans cette commande.
tandis que
E
L'option indique grep
d'utiliser une expression régulière étendue (pour prendre en charge les parenthèses) et ...H
L'option 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
Où
|
[pipe] envoie la sortie de find
à la commande suivante après ceci (qui est sed
, alors sort
)r
option indique sed
d'utiliser une expression régulière étendue.s/HI/BYE/
dit sed
de remplacer chaque première occurrence (par ligne) de "HI" par "BYE" et ...s/(^.*):.*$/\1/
lui dit de remplacer l'expression régulière (^.*):.*$
(signifiant un groupe [truc entouré par ()
] comprenant tout [ .*
= un ou plusieurs de n'importe quel caractère] depuis le début de la ligne [ ^
] jusqu'à 'le premier': 'suivi de n'importe quoi jusqu'à' la fin de line [ $
]) par le premier groupe [ \1
] de l'expression régulière remplacée.u
indique à sort de supprimer les entrées en double (à prendre 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 aussi de donner des explications plus complètes sur certains outils que vous pourriez utiliser).