2011-05-27 102 views
93

在bash我要爲含有不區分大小寫"document.cookie" | "setcookie"bash腳本 - 找到文件,其中包含文本

我怎麼會做這種類型的.php|.html|.js的每個文件返回文件名(和文件路徑)?

+4

你有沒有考慮過只使用grep? http://www.cyberciti.biz/faq/grep-in-bash/ – Terrance 2011-05-27 13:52:11

回答

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

如果你只是想文件名添加了L位(小寫L):

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

第二個例子是完美的,我喜歡它的簡短。 – Owen 2011-05-27 15:08:31

+0

這似乎並沒有爲我工作(至少不是在Mac上)....只是掛起... egrep -lir --include = *「回購」 egrep:警告:stdin的遞歸搜索 – 2014-04-02 14:18:47

+10

你忘了添加搜索路徑。路徑是'。'在上面的例子中。在你的情況下,腳本正在等待輸入在stdin上搜索。嘗試:egrep -lir --include = *「repo」/(或任何其他路徑) – LodeRunner 2014-05-06 16:47:13

6

聽起來像是一個完美的工作爲grep或許ack

或者這個奇妙的建築:

find . -type f \(-name *.php -o -name *.html -o -name *.js \) -exec grep "document.cookie\|setcookie" /dev/null {} \; 
+0

+1使用'-exec grep ...'比我的'xargs'方法更好,因爲它不會阻塞文件名中的空格。 – 2011-05-27 14:09:56

31

試着這麼做grep -r -n -i --include="*.html *.php *.js" searchstrinhere .

的-i使得情況insensitlve

的「」最後意味着你想從你當前的目錄開始,這可以用任何目錄代替。

的「-r」手段做到這一點遞歸,一直目錄樹

了「-n」打印匹配項的行號。

「--include」允許您添加文件名,擴展名。通配符接受

欲瞭解更多信息,請參閱:http://www.gnu.org/software/grep/

+4

或者使用'-l'選項(只是打印匹配的文件名)而不是'-n' – 2011-05-27 14:03:48

+0

@glenn jackman好點 – Raoul 2011-05-27 14:07:54

12

find他們grep的字符串:

這將在/啓動/路徑和grep的正則表達式'(document\.cookie|setcookie)'你3種類型的所有文件。拆分爲兩行用反斜槓只是可讀性...

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

就像普遍使用find一樣,但是在我的腦海裏最好使用'-exec grep -l' '#} \;' – NGix 2012-11-26 18:28:32

+0

謝謝@Michael Berkowski這種方式在〜500Gb的weigth目錄下最快超過5或8次'#egrep -ir --include = file.foo「(foo | bar)」/ dir'。 – Qh0stM4N 2018-01-24 13:55:24

3
find . -type f -name '*php' -o -name '*js' -o -name '*html' |\ 
xargs grep -liE 'document\.cookie|setcookie' 
2

只是爲了還包括一個替代方案,你也可以使用這個:

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

其中:

  • -regextype posix-extended告訴find什麼樣的正則表達式的期望
  • -regex "^.*\.(php|html|js)$"告訴find正則表達式本身的文件名必須匹配
  • -exec grep -EH '(document\.cookie|setcookie)' {} \;告訴find運行的命令(其選項和參數)在-exec選項和\;之間爲其找到的每個文件指定,其中{}表示文件路徑在此命令中的位置。

    • E選項告訴grep使用擴展正則表達式(支持括號)和...
    • H選項告訴grep比賽之前打印的文件路徑。

而且,鑑於此,如果您只想文件路徑,你可以使用:

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

  • | [管道]送find輸出到這之後的下一個命令(這是sed,然後sort
  • r選項告知sed使用擴展正則表達式。
  • s/HI/BYE/告訴sed替換每一次出現(每行)告訴它的「HI」與「BYE」和...
  • s/(^.*):.*$/\1/替換正則表達式(^.*):.*$(意味着 [由()封閉東西]包括一切 [.* =一個或多個任意的字符的來自該行的開頭 [^]直到「第一‘:’隨後任何直到」線 [的端3210])被替換的正則表達式的第一個 [\1]。
  • u通知排序刪除重複條目(以sort -u爲可選項)。

...遠離最優雅的方式。正如我所說的,我的意圖是增加可能性的範圍(並且對你可以使用的一些工具給出更完整的解釋)。