查找文件内容linux - 如何在Linux上找到包含特定文本的所有文件?




ls grep用法 (20)

如何在Linux上找到包含特定文本的所有文件? (......)

我兩次遇到這個解決方案:

find / -type f -exec grep -H 'text-to-find-here' {} \;

如果在你的例子中使用find ,最好在命令末尾添加-s ( - --no-messages )和命令末尾的2>/dev/null ,以避免grepfind發出的許多Permission denied消息:

grep -RIl "" .

find是在類Unix平台上搜索文件的標準工具 - 在查找特定文本時與grep結合使用。 順便說一句, find命令通常與xargs結合使用。

為同一目的存在更快更容易的工具 - 見下文。 如果它們在您的平台上可用,請更好地嘗試它們,當然:

更快更容易的替代品

ripgrep - 最快的搜索工具:

find / -type f -exec grep -sH 'text-to-find-here' {} \; 2>/dev/null

銀色搜索者

rg 'text-to-find-here' / -l

ack

ag 'text-to-find-here' / -l

注意:您也可以向這些命令添加2>/dev/null ,以隱藏許多錯誤消息。

警告除非你真的無法避免,否則不要在'/' (根目錄)中搜索以避免長時間和低效的搜索! 因此,在上面的示例中,您最好用子目錄名替換' / ',例如“/ home”取決於您實際想要搜索的位置...

我正在嘗試找到一種方法來掃描整個Linux系統,查找包含特定文本字符串的所有文件。 只是為了澄清,我在文件中尋找文本,而不是文件名。

當我查找如何做到這一點時,我遇到了兩次這個解決方案:

find / -type f -exec grep -H 'text-to-find-here' {} \;

但是,它不起作用。 它似乎顯示系統中的每個文件。

這是否接近正確的方法呢? 如果沒有,我該怎麼辦? 這種在文件中查找文本字符串的能力對於我正在做的一些編程項目非常有用。


包含給定文本的文件名列表

首先,我相信您使用了-H而不是-l 。 您也可以嘗試在引號內添加文本,然後添加{} \

find / -type f -exec grep -l "text-to-find-here" {} \; 

假設您正在目錄中搜索包含特定文本“Apache License”的文件。 它將顯示與下麵類似的結果(輸出將根據您的目錄內容而有所不同)。

bash-4.1$ find . -type f -exec grep -l "Apache License" {} \; 
./net/java/jvnet-parent/5/jvnet-parent-5.pom
./commons-cli/commons-cli/1.3.1/commons-cli-1.3.1.pom
./io/swagger/swagger-project/1.5.10/swagger-project-1.5.10.pom
./io/netty/netty-transport/4.1.7.Final/netty-transport-4.1.7.Final.pom
./commons-codec/commons-codec/1.9/commons-codec-1.9.pom
./commons-io/commons-io/2.4/commons-io-2.4.pom
bash-4.1$ 

區分大小寫敏感度

即使您不使用“text”與“TEXT”之類的情況,也可以使用-i開關忽略大小寫。 您可以here閱讀更多詳細信息

希望這對你有所幫助。


Silver Searcher是一個了不起的工具,但ripgrep可能會更好。

它可以在Linux,Mac和Windows上運行,幾個月前在Hacker News上編寫(這有一個鏈接到Andrew Gallant的Blog,它有一個GitHub鏈接):

Ripgrep - 一種新的命令行搜索工具


grep是你實現這一目標的好朋友。

grep -r <text_fo_find> <directory>

如果你不關心文本的情況下找到然後使用

grep -ir <text_to_find> <directory>

以下是可用於搜索文件的幾個命令列表。

grep "text string to search” directory-path

grep [option] "text string to search” directory-path

grep -r "text string to search” directory-path

grep -r -H "text string to search” directory-path

egrep -R "word-1|word-2” directory-path

egrep -w -R "word-1|word-2” directory-path

你可以使用ack 。 它就像grep的源代碼。 您可以使用它掃描整個文件系統。

做就是了:

ack 'text-to-find-here'

在根目錄中。

您還可以使用正則表達式 ,指定文件類型等。

UPDATE

我剛剛發現了The Silver Searcher ,它類似於ack但比它快3-5倍,甚至忽略了.gitignore文件中的模式。


你可以用這個:

grep -inr "Text" folder/to/be/searched/

使用pwd從您所在的任何目錄中搜索,向下遞歸

grep -rnw `pwd` -e "pattern"

更新根據您使用的grep版本,您可以省略pwd 。 在較新的版本. 如果沒有給出目錄,似乎是grep的默認情況:

grep -rnw -e "pattern"

要么

grep -rnw "pattern"

會做同上面的事情!


即使我們沒有找到字符串,也可以使用grep

簡單地跑,

ack 'text-to-find-here' / -l

將打印出所有文本文件的路徑,即僅包含可打印字符的文件。


嘗試:

find . -name "*.txt" | xargs grep -i "text_pattern"

如果你的grep不支持遞歸搜索,你可以將findxargs結合使用:

find / -type f | xargs grep 'text-to-find-here'

我覺得這比find -exec的格式更容易記住。

這將輸出文件名和匹配行的內容,例如

/home/rob/file:text-to-find-here

您可能想要添加到grep可選標誌:

  • -i - 不區分大小寫的搜索
  • -l - 僅輸出找到匹配項的文件名
  • -h - 僅輸出匹配的行(不是文件名)

希望這有助於......

稍微擴展grep以在輸出中提供更多信息,例如,獲取文本所在文件中的行號可以按如下方式完成:

find . -type f -name "*.*" -print0 | xargs --null grep --with-filename --line-number --no-messages --color --ignore-case "searthtext"

如果你知道文件類型是什麼,你可以通過指定要搜索的文件類型擴展來縮小搜索範圍,在這種情況下.pas.dfm文件:

find . -type f \( -name "*.pas" -o -name "*.dfm" \) -print0 | xargs --null grep --with-filename --line-number --no-messages --color --ignore-case "searchtext"

選項的簡短說明:

  1. .find指定當前目錄。
  2. -name*.* ”:表示所有文件(-name“ *.pas ”-o -name“ *.dfm ”):只有*.pas OR *.dfm文件,或者用-o指定
  3. -type f指定您正在查找文件
  4. -print0--null在另一側 (管道)是關鍵的,將文件名從find發送到嵌入在xargsgrep ,允許在文件名中傳遞帶有空格的文件名,允許grep將路徑和文件名視為一個字符串,而不是破壞它在每個空間。

我寫了一個Python腳本 ,它做了類似的事情。 這就是人們應該如何使用這個腳本。

./sniff.py path pattern_to_search [file_pattern]

第一個參數path是遞歸搜索的目錄。 第二個參數pattern_to_search是我們想要在文件中搜索的正則表達式。 我們使用Python re庫中定義的正則表達式格式。 在這個腳本中, . 也匹配換行。

第三個參數file_pattern是可選的。 這是另一個適用於文件名的正則表達式。 僅考慮與此正則表達式匹配的那些文件。

例如,如果我想搜索擴展名py包含Pool( Python文件Pool(後跟單詞Adaptor ,我會執行以下操作,

./sniff.py . "Pool(.*?Adaptor"  .*py
./Demos/snippets/cubeMeshSigNeur.py:146 
./Demos/snippets/testSigNeur.py:259 
./python/moose/multiscale/core/mumbl.py:206 
./Demos/snippets/multiComptSigNeur.py:268 

瞧,它會生成匹配文件的路徑和找到匹配項的行號。 如果找到多個匹配項,則每個行號將附加到文件名。


我很著迷於grep用'rl'做出的簡單方法

grep -rl 'pattern_to_find' /path/where/to/find

-r to find recursively file / directory inside directories..
-l to list files matching the 'pattern'

使用'-r'而不是'l'來查看文件名後面跟著找到模式文本

grep -r 'pattern_to_find' /path/where/to/find

工作得很完美..

希望能幫助到你!


有一個ack工具可以完全滿足您的需求。

http://linux.die.net/man/1/ack

ack -i search_string folder_path/*

您可以忽略-i用於區分大小寫的搜索


有一個名為The Silversearcher的新工具

sudo apt install silversearcher-ag

它與Git和其他VCS密切合作。 所以你不會在.git或其他目錄中獲得任何東西。

你可以簡單地使用

ag -ia "Search query"

它會為你完成任務!


要搜索字符串並使用搜索字符串輸出該行:

for i in $(find /path/of/target/directory -type f); do grep -i "the string to look for" "$i"; done

例如:

for i in $(find /usr/share/applications -type f); \
do grep -i "web browser" "$i"; done

要顯示包含搜索字符串的文件名:

for i in $(find /path/of/target/directory -type f); do if grep -i "the string to look for" "$i" > /dev/null; then echo "$i"; fi; done;

例如:

for i in $(find /usr/share/applications -type f); \
do if grep -i "web browser" "$i" > /dev/null; then echo "$i"; \
fi; done;

試試這個:

find . | xargs grep 'word' -sl

避免麻煩並安裝ack-grep。 它消除了許多許可和報價問題。

apt-get install ack-grep

然後轉到要搜索的目錄並運行以下命令

cd /
ack-grep "find my keyword"

find /path -type f -exec grep -l "string" {} \;

評論解釋

find是一個命令,可以讓您在給定路徑的子目錄中查找文件和其他對象,如目錄和鏈接。 如果未指定文件名應滿足的掩碼,則枚舉所有目錄對象。

-type f specifies that it should proceed only files, not directories etc.
-exec grep specifies that for every found file, it should run grep command, passing its filename as an argument to it, by replacing {} with the filename






find