etc./StackOverFlow

Linux에서 특정 텍스트가 포함된 모든 파일을 어떻게 찾습니까?

청렴결백한 만능 재주꾼 2021. 9. 25. 02:02
반응형

질문자 :Nathan


특정 텍스트 문자열이 포함된 모든 파일에 대해 전체 Linux 시스템을 검색하는 방법을 찾으려고 합니다. 명확히하기 위해 파일 이름이 아닌 파일 내에서 텍스트를 찾고 있습니다.

이 작업을 수행하는 방법을 찾고 있을 때 이 솔루션을 두 번 발견했습니다.

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

그러나 작동하지 않습니다. 시스템의 모든 단일 파일을 표시하는 것 같습니다.

이것이 올바른 방법에 가깝습니까? 그렇지 않다면 어떻게 해야 합니까? 파일에서 텍스트 문자열을 찾는 이 기능은 내가 하고 있는 일부 프로그래밍 프로젝트에 매우 유용합니다.



답변자 : rakib_


다음을 수행합니다.

 grep -rnw '/path/to/somewhere/' -e 'pattern'
  • -r 또는 -R 은 재귀적이며,
  • -n 은 줄 번호이고
  • -w 는 전체 단어 일치를 나타냅니다.
  • -l (소문자 L)을 추가하여 일치하는 파일의 파일 이름을 지정할 수 있습니다.
  • -e 는 검색 중에 사용되는 패턴입니다.

이와 함께 --exclude , --include , --exclude-dir 플래그를 사용하여 효율적인 검색을 수행할 수 있습니다.

  • 확장자가 .c 또는 .h인 파일만 검색합니다.
 grep --include=\*.{c,h} -rnw '/path/to/somewhere/' -e "pattern"
  • 이렇게 하면 확장자가 .o로 끝나는 모든 파일 검색이 제외됩니다.
 grep --exclude=\*.o -rnw '/path/to/somewhere/' -e "pattern"
  • --exclude-dir 매개변수를 사용하여 하나 이상의 디렉토리를 제외할 수 있습니다. 예를 들어, 이것은 dir1/, dir2/ 및 *.dst/와 일치하는 모든 디렉토리를 제외합니다.
 grep --exclude-dir={dir1,dir2,*.dst} -rnw '/path/to/somewhere/' -e "pattern"

이것은 당신과 거의 같은 목적을 달성하기 위해 저에게 매우 효과적입니다.

더 많은 옵션을 보려면 man grep 을 확인하십시오.



답변자 : fedorqui 'SO stop harming'


grep -ilR 사용할 수 있습니다.

 grep -Ril "text-to-find-here" /
  • i 는 대소문자 무시를 나타냅니다(귀하의 경우 선택 사항).
  • R 은 재귀를 나타냅니다.
  • l 은 "결과 자체가 아닌 파일 이름 표시"를 나타냅니다.
  • / 는 컴퓨터의 루트에서 시작함을 나타냅니다.


답변자 : Stephan


ack 을 사용할 수 있습니다. 소스 코드에 대한 grep 과 같습니다. 그것으로 전체 파일 시스템을 스캔할 수 있습니다.

그냥 해:

 ack 'text-to-find-here'

루트 디렉토리에서.

정규식 을 사용하고 파일 형식 등을 지정할 수도 있습니다.


업데이트

방금 The Silver Searcher 를 발견했는데 ack 과 비슷하지만 3-5배 더 빠르며 .gitignore 파일의 패턴도 무시합니다.



답변자 : learner_19


당신이 사용할 수있는:

 grep -r "string to be searched" /path/to/dir

r 은 재귀를 의미하므로 지정된 경로와 해당 하위 디렉토리에서 검색합니다. 이렇게 하면 파일 이름을 알려줄 뿐만 아니라 파일에서 문자열이 나타나는 줄을 인쇄할 수 있습니다.

또는 모든 자바스크립트 파일(*.js)에서 검색하기 위해 시도하는 것과 유사한 명령(예: ):

 find . -name '*.js' -exec grep -i 'string to search for' {} \; -print

이렇게 하면 텍스트가 나타나는 파일의 행이 인쇄되지만 파일 이름은 인쇄되지 않습니다.

이 명령 외에도 다음과 같이 작성할 수 있습니다. grep -rn "검색할 문자열" /path/to/directory/or/file -r: 재귀 검색 n: 일치하는 행 번호가 표시됩니다.



답변자 : A R


다음을 사용할 수 있습니다.

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


답변자 : kenorb


grep ( GNU 또는 BSD )

grep 도구를 사용하여 다음과 같이 현재 폴더를 재귀적으로 검색할 수 있습니다.

 grep -r "class foo" .

참고: -r - 하위 디렉토리를 재귀적으로 검색합니다.

또한 globbing 구문을 사용하여 다음과 같은 특정 파일 내에서 검색할 수 있습니다.

 grep "class foo" **/*.c

참고: globbing 옵션 ( ** )을 사용하여 특정 확장자 또는 패턴으로 모든 파일을 재귀적으로 검색합니다. 이 구문을 활성화하려면 shopt -s globstar 실행하십시오. 모든 파일(숨김 및 확장자 제외) 또는 기타 패턴에 **/*.* 를 사용할 수도 있습니다.

인수가 너무 길다는 오류가 발생한 경우 검색 범위를 좁히거나 다음과 같은 대신 find

 find . -name "*.php" -execdir grep -nH --color=auto foo {} ';'

또는 ripgrep 사용하십시오.

ripgrep

더 큰 프로젝트나 큰 파일에서 작업하는 경우 다음과 같이 대신 ripgrep

 rg "class foo" .

GitHub 프로젝트 페이지 에서 문서, 설치 단계 또는 소스 코드를 확인하세요.

그것은 훨씬 빨리와 같은 다른 도구에 비해입니다 GNU / BSD의 grep , ucg , ag , sift , ack , pt 가 위에 구축되어 있기 때문에 또는 유사한, 녹의 정규식 엔진이 매우 빠르게 검색 할 수 있도록, SIMD 공격적인 문자 최적화를 유한 오토마타를 사용 .

.gitignore 파일에 지정된 무시 패턴을 지원하므로 단일 파일 경로가 여러 glob 패턴과 동시에 일치될 수 있습니다.


다음과 같은 공통 매개변수를 사용할 수 있습니다.

  • -i - 둔감한 검색.
  • -I - 바이너리 파일을 무시합니다.
  • -w - 전체 단어를 검색합니다(부분 단어 일치의 반대).
  • -n - 경기 라인을 표시합니다.
  • -C / --context (예 -C5 ) - 증가 컨텍스트, 그래서 당신은 주변의 코드를 참조하십시오.
  • --color=auto - 일치하는 텍스트를 표시합니다.
  • -H - 텍스트가 있는 파일 이름을 표시합니다.
  • -c - 일치하는 줄 수를 표시합니다. -H 와 결합할 수 있습니다.


답변자 : lkamal


주어진 텍스트를 포함하는 파일 이름 목록

-l 대신 -H 를 사용했다고 생각합니다. 또한 따옴표 안에 텍스트를 추가하고 그 뒤에 {} \ 추가할 수 있습니다.

 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 스위치를 사용하여 대소문자를 무시할 수 있습니다. 자세한 내용은 여기에서 읽을 수 있습니다.

도움이 되기를 바랍니다.



답변자 : RobEarl


grep 이 재귀 검색을 지원하지 않는 경우 findxargs 결합할 수 있습니다.

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

find -exec 형식보다 기억하기 쉽습니다.

이렇게 하면 파일 이름과 일치하는 줄의 내용이 출력됩니다. 예를 들어

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

grep 에 추가할 수 있는 선택적 플래그:

  • -i - 대소문자를 구분하지 않는 검색
  • -l - 일치하는 파일 이름만 출력
  • -h - 일치하는 줄만 출력합니다(파일 이름이 아님).


답변자 : enfinet


grep -insr "pattern" *
  • i : PATTERN과 입력 파일 모두에서 대소문자 구분을 무시합니다.
  • n : 입력 파일 내에서 1부터 시작하는 줄 번호로 출력의 각 줄에 접두사를 붙입니다.
  • s : 존재하지 않거나 읽을 수 없는 파일에 대한 오류 메시지를 표시하지 않습니다.
  • r : 각 디렉토리에 있는 모든 파일을 재귀적으로 읽습니다.


답변자 : Neil Agarwal


The Silversearcher 라는 새로운 유틸리티가 있습니다.

 sudo apt install silversearcher-ag

Git 및 기타 VCS와 긴밀하게 작동합니다. 따라서 .git 또는 다른 디렉토리에서 아무 것도 얻지 못할 것입니다.

당신은 단순히 사용할 수 있습니다

 ag "Search query"

그리고 그것은 당신을 위해 일을 할 것입니다!



답변자 : Bludzee


Linux에서 특정 텍스트가 포함된 모든 파일을 어떻게 찾습니까? (...)

나는이 솔루션을 두 번 발견했습니다.

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


귀하의 예에서와 같이 find를 사용하는 경우 grep -s ( --no-messages )를 추가하고 명령 끝에 2>/dev/null grepfind 발행하는 많은 권한 거부 메시지를 방지하십시오.

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

find 는 Unix 계열 플랫폼에서 특정 텍스트를 찾을 때 grep과 결합된 파일 검색을 위한 표준 도구입니다. 그런데 find 명령은 종종 xargs 와 결합됩니다.

같은 목적을 위해 더 빠르고 쉬운 도구가 있습니다. 아래를 참조하십시오. 물론 귀하의 플랫폼에서 사용할 수 있는 경우 더 나은 시도:

더 빠르고 쉬운 대안

RipGrep - 가장 빠른 검색 도구:

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

실버 수색자 :

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

확인 :

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

참고: 2>/dev/null 을 추가하여 많은 오류 메시지를 숨길 수도 있습니다.


경고 : 정말 피할 수 없다면, 길고 비효율적인 검색을 피하기 위해 '/' (루트 디렉토리)에서 검색하지 마십시오! 따라서 위의 예에서 ' / '를 실제로 검색하려는 위치에 따라 "/home"과 같은 하위 디렉토리 이름으로 바꾸는 것이 좋습니다.



답변자 : venkat


노력하다:

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


답변자 : mahatmanich


pwd 를 사용하여 현재 있는 디렉토리에서 아래쪽으로 재귀하여 검색합니다.

 grep -rnw `pwd` -e "pattern"

업데이트 사용 중인 grep 버전에 따라 pwd 를 생략할 수 있습니다. 최신 버전에서 . 디렉토리가 다음과 같이 제공되지 않으면 grep의 기본 경우인 것 같습니다.

grep -rnw -e "pattern"

또는

grep -rnw "pattern"

위와 같은 작업을 수행합니다!



답변자 : Alex Jasmin


grep 은 문자열을 찾지 않아도 사용할 수 있습니다.

단순히 실행,

 grep -RIl "" .

모든 텍스트 파일, 즉 인쇄 가능한 문자만 포함하는 파일의 경로를 인쇄합니다.



답변자 : AAAfarmclub


Silver Searcher는 훌륭한 도구이지만 ripgrep이 더 나을 수 있습니다.

Linux, Mac 및 Windows에서 작동 하며 몇 달 전에 Hacker News 에 작성되었습니다(여기에는 GitHub 링크가 있는 Andrew Gallant의 블로그 링크가 있습니다).

Ripgrep – 새로운 명령줄 검색 도구



답변자 : BreakBadSP


엄격하게 find 를 사용하려면 find + grep 을 사용하십시오.

find /path/to/somewhere/ -type f -exec grep -nw 'textPattern' {} \;

단계 :

  1. find 를 사용하여 파일 검색,
  2. 그들 모두에 대해 grep 을 실행하십시오.

이것은 find 위한 찾기 기능을 제공합니다.

  • 특정 파일만 grep -name Pattern 사용하십시오.

find /path/to/somewhere/ -type f -name \*.cpp -exec grep -nw 'textPattern' {} \;

find 옵션을 사용하여 파일 검색을 개선할 수 있습니다.



답변자 : Atul Arvind


다음은 파일 검색에 사용할 수 있는 몇 가지 명령 목록입니다.

 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


답변자 : nitinr708


나는 grep 이 'rl'을 사용하여 만드는 방법에 매료되었습니다.

 grep -rl 'pattern_to_find' /path/where/to/find -r to recursively find a file / directory inside directories.. -l to list files matching the 'pattern'

'l' 없이 '-r'을 사용하면 파일 이름 뒤에 패턴이 있는 텍스트가 표시됩니다 !

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

그것은 완벽하게 작동합니다 ...



답변자 : Vinod Joshi


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


답변자 : Gert van Biljon


도움이 되기를 바랍니다...

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 또는 *.dfm 파일만, 또는 -o
  3. -type f 는 파일을 찾고 있음을 지정합니다.
  4. -print0--null| (파이프)는 xargs 포함된 find 에서 grep 전달하는 중요한 것입니다. 각 공간에.


답변자 : danglingpointer


간단한 find 가 유용할 수 있습니다. ~/.bashrc 파일에 별칭을 지정합니다.

 alias ffind find / -type f | xargs grep

새 터미널을 시작하고 다음을 실행하십시오.

 ffind 'text-to-find-here'


답변자 : Prash


grep 은 이를 달성하기 위한 좋은 친구입니다.

 grep -r <text_fo_find> <directory>

찾을 텍스트의 대소문자에 신경 쓰지 않는다면 다음을 사용하십시오.

 grep -ir <text_to_find> <directory>


답변자 : Dilawar


비슷한 작업을 수행 하는 Python 스크립트 를 작성했습니다. 이것이 이 스크립트를 사용하는 방법입니다.

 ./sniff.py path pattern_to_search [file_pattern]

첫 번째 인수인 path 는 재귀적으로 검색할 디렉토리입니다. 두 번째 인수인 pattern_to_search 는 파일에서 검색하려는 정규식입니다. Python re 라이브러리에 정의된 정규식 형식을 사용합니다. 이 스크립트에서 . 개행과도 일치합니다.

세 번째 인수인 file_pattern 은 선택 사항입니다. 이것은 파일 이름에서 작동하는 또 다른 정규식입니다. 이 정규식과 일치하는 파일만 고려됩니다.

예를 들어, Pool( Adaptor 라는 단어가 포함 py Python 파일을 검색하려면 다음을 수행합니다.

 ./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

그리고 짜잔, 그것은 일치하는 파일의 경로와 일치가 발견된 줄 번호를 생성합니다. 둘 이상의 일치 항목이 발견되면 각 줄 번호가 파일 이름에 추가됩니다.



답변자 : user4863663


노력하다:

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

/ 가 루트 폴더이기 때문에 모든 파일 시스템을 검색합니다.

홈 폴더 사용:

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

현재 폴더 사용:

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


답변자 : Pal


당신이 찾고있는 것을 정확히 수행하는 ack

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

 ack -i search_string folder_path/*

대소문자를 구분하는 검색의 경우 -i 를 무시할 수 있습니다.



답변자 : Dr_Hope


사용하다:

 grep -c Your_Pattern *

이것은 현재 디렉토리의 각 파일에 얼마나 많은 패턴 사본이 있는지 보고합니다.



답변자 : user3124504


문자열을 검색하고 검색 문자열과 함께 해당 라인만 출력하려면:

 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;


답변자 : Peter M. - stands for Monica


이전의 모든 답변은 grep 및 find를 제안합니다. 하지만 다른 방법이 있습니다. Midnight Commander 사용

GUI가 아닌 시각적인 무료 유틸리티(30년, 시간으로 입증됨)입니다. 수많은 기능이 있으며 파일을 찾는 것은 그 중 하나일 뿐입니다.



답변자 : Pradeep Goswami


아래 명령은 이 접근 방식에 대해 잘 작동합니다.

 find ./ -name "file_pattern_name" -exec grep -r "pattern" {} \;


답변자 : Mitul Patel


파일 이름은 원하지 않지만 모든 파일에서 검색하려면 아래 명령을 사용할 수 있습니다. 다음은 "TEXT" 형식을 캡처하고 있습니다. 파일 이름이 인쇄되지 않도록 하는 모든 로그 파일입니다.

 grep -e TEXT *.log | cut -d' ' --complement -s -f1

-e 옵션이 있는 grep은 PATTERN 일치를 위한 것이므로 다른 옵션에 비해 매우 빠릅니다.



출처 : Here


출처 : http:www.stackoverflow.com/questions/16956810/how-do-i-find-all-files-containing-specific-text-on-linux">

반응형