나는 텍스트의 특정 문자열을 포함하는 모든 파일에 대해 전체 리눅스 시스템을 스캔하는 방법을 찾고있다. 명확히하기 위해 파일 이름이 아닌 파일 내에서 텍스트를 찾고 있습니다.
이렇게하는 방법을 찾았을 때이 솔루션을 두 번 보았습니다.
find / -type f -exec grep -H 'text-to-find-here' {} \;
그러나 작동하지 않습니다. 그것은 시스템의 모든 단일 파일을 표시하는 것 같습니다.
이것이 적절한 방법인가? 그렇지 않다면 어떻게해야합니까? 파일에서 텍스트 문자열을 찾는이 기능은 내가하고있는 일부 프로그래밍 프로젝트에 매우 유용 할 것입니다.
다음을 수행하십시오.
grep -rnw '/path/to/somewhere/' -e 'pattern'
-r
또는 -R
는 재귀 적입니다.-n
는 줄 번호이며-w
는 전체 단어와 일치해야합니다.-l
(소문자 L)를 추가 할 수 있습니다.이와 함께 --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
를 확인하십시오.
grep -ilR
를 사용할 수 있습니다 :
grep -Ril "text-to-find-here" /
i
은 대소 문자 무시를 나타냅니다 (선택 사항).R
은 재귀 적 의미를 나타냅니다.l
은 "결과 자체가 아닌 파일 이름 표시"를 나타냅니다./
는 컴퓨터의 루트에서 시작하는 것을 의미합니다.ack 을 사용할 수 있습니다. 소스 코드는 grep 와 같습니다. 그것으로 전체 파일 시스템을 검사 할 수 있습니다.
그냥 해:
ack 'text-to-find-here'
루트 디렉토리에 있습니다.
정규식 을 사용하거나, 파일 형식을 지정할 수도 있습니다.
업데이트
방금 The Silver Searcher 를 발견했습니다.이 것은 ack와 비슷하지만 3-5 배 빠르며 .gitignore
파일의 패턴도 무시합니다.
당신이 사용할 수있는:
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/또는/file r : 재귀 적 검색 이 명령 이외에도이 명령을 쓸 수 있습니다. n : 일치하는 줄 번호가 표시됩니다.
이것을 사용할 수 있습니다 :
grep -inr "Text" folder/to/be/searched/
grep
NAME _ ( 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
NAME _ 을 사용하십시오.
ripgrep
NAME _큰 프로젝트 나 큰 파일을 작업하는 경우 다음과 같이 ripgrep
name__을 대신 사용해야합니다.
rg "class foo" .
GitHub 프로젝트 페이지 에서 문서, 설치 단계 또는 소스 코드를 확인하십시오.
GNU / BSDgrep
NAME _ 와 같은 다른 도구보다 훨씬 빠릅니다. ucg
NAME _ , ag
NAME _ , sift
NAME _ , ack
NAME _ , pt
NAME _ 또는 이와 유사한 이유는 유한 오토마타, SIMD 및 적극적인 리터럴 최적화를 사용하는 Rust의 정규식 엔진 위에 구축되어 있기 때문입니다. 매우 빠른 검색.
.gitignore
파일에 지정된 무시 패턴을 지원하므로 단일 파일 경로를 여러 glob 패턴과 동시에 일치시킬 수 있습니다.
다음과 같은 일반적인 매개 변수를 사용할 수 있습니다.
-i
-검색에 둔감합니다.-I
-이진 파일을 무시하십시오.-w
-단어 전체를 검색합니다 (일부 단어 일치와 반대).-n
-일치하는 줄을 표시합니다.-C
/--context
(예 : -C5
)-컨텍스트가 증가하므로 주변 코드가 표시됩니다.--color=auto
-일치하는 텍스트를 표시하십시오.-H
-텍스트가있는 파일 이름을 표시합니다.-c
-일치하는 줄 수를 표시합니다. -H
와 함께 사용할 수 있습니다.우선, 나는 -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"vs "TEXT"와 같은 대소 문자를 사용하지 않더라도 -i
스위치를 사용하여 대/소문자를 무시할 수 있습니다. 자세한 내용은 here 를 읽을 수 있습니다.
희망이 당신을 도와줍니다.
grep
이 재귀 검색을 지원하지 않으면 find
과 xargs
을 결합 할 수 있습니다.
find / -type f | xargs grep 'text-to-find-here'
나는 이것을 find -exec
의 형식보다 쉽게 기억하고 있습니다.
그러면 일치하는 줄의 파일 이름과 내용이 출력됩니다.
/home/rob/file:text-to-find-here
grep
에 추가 할 수있는 선택적 플래그 :
-i
- 대소 문자를 구분하지 않는 검색-l
- 일치하는 부분이있는 파일 만 출력합니다.-h
- 일치하는 행만 출력합니다 (파일 이름이 아님).grep -insr "pattern" *
i
: PATTERN과 입력 파일에서 대소 문자 구분을 무시합니다.n
: 각 출력 행 앞에 입력 파일의 1 기준 행 번호를 붙입니다.s
: 존재하지 않거나 읽을 수없는 파일에 대한 오류 메시지를 표시하지 않습니다.r
: 각 디렉토리 아래의 모든 파일을 반복적으로 읽습니다.Linux에서 특정 텍스트가 포함 된 모든 파일을 찾으려면 어떻게합니까? (...)
이 솔루션을 두 번 보았습니다.
find / -type f -exec grep -H 'text-to-find-here' {} \;
예와 같이 find을 사용하는 경우 grep
에 -s
(--no-messages
)를 추가하고 명령 끝에 2>/dev/null
를 추가하여 많은 것을 피하십시오 grep
및 find
에서 발행 한 Permission denied 메시지 :
find / -type f -exec grep -sH 'text-to-find-here' {} \; 2>/dev/null
find는 유닉스 계열 플랫폼에서 특정 텍스트를 찾을 때 grep과 결합 된 파일 검색을위한 표준 도구입니다. 그런데 find 명령은 종종 xargs 와 결합됩니다.
같은 목적으로 더 빠르고 쉬운 도구가 존재합니다 (아래 참조). 물론 를 플랫폼에서 사용할 수 있다면
RipGrep-가장 빠른 검색 도구 :
rg 'text-to-find-here' / -l
실버 검색기 :
ag 'text-to-find-here' / -l
ack :
ack 'text-to-find-here' / -l
참고 : 이러한 명령에 2>/dev/null
를 추가하여 많은 오류 메시지를 숨길 수 있습니다.
경고 : 실제로 피할 수 없다면 '/' (루트 디렉토리)에서 검색하지 마십시오 길고 비효율적 인 검색을 피하기 위해 위의 예에서, '/'를 실제로 원하는 위치에 따라 "/ home"과 같은 하위 디렉토리 이름으로 바꾸는 것이 좋습니다. 검색하려면 ...
시험:
find . -name "*.txt" | xargs grep -i "text_pattern"
The Silversearcher라는 새로운 유틸리티가 있습니다
Sudo apt install silversearcher-ag
이것은 Git과 다른 VCS와 긴밀하게 작동합니다. 따라서 .git 또는 다른 디렉토리에서 아무 것도 얻지 못할 것입니다.
당신은 단순히 사용할 수 있습니다.
ag -ia "Search query"
그리고 그것은 당신을위한 일을 할 것입니다!
pwd
을 사용하여 현재있는 디렉토리에서 검색하고 아래쪽으로 되풀이합니다.
grep -rnw `pwd` -e "pattern"
Update 사용중인 grep의 버전에 따라 pwd
을 생략 할 수 있습니다. 새로운 버전에서 .
는 디렉토리가 지정되지 않은 경우 grep의 기본 경우 인 것 같습니다.
grep -rnw -e "pattern"
또는
grep -rnw "pattern"
위와 같은 일을 할 것입니다!
grep
은 문자열을 찾지 않아도 사용할 수 있습니다.
간단히 말해서,
grep -RIl "" .
인쇄 가능한 문자 만 포함 된 모든 텍스트 파일에 대한 경로를 인쇄합니다.
다음은 파일 검색에 사용할 수있는 몇 가지 명령 목록입니다.
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
간단한 find
을 사용하면 편리합니다. ~/.bashrc
파일에서 별칭을 지정하십시오.
alias ffind find / -type f | xargs grep
새 터미널을 시작하고 다음을 실행하십시오.
ffind 'text-to-find-here'
find /path -type f -exec grep -l "string" {} \;
의견 설명
find는 지정된 경로의 하위 디렉토리에있는 디렉토리 및 링크와 같은 파일 및 기타 객체를 찾을 수있게 해주는 명령입니다. filesnames가 충족해야하는 마스크를 지정하지 않으면 모든 디렉토리 객체가 열거됩니다.
-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
희망이 도움이 ...
grep
비트를 확장하여 출력에서 더 많은 정보를 얻으려면, 예를 들어 텍스트가있는 파일에서 줄 번호를 얻으려면 다음과 같이하십시오.
find . -type f -name "*.*" -print0 | xargs --null grep --with-filename --line-number --no-messages --color --ignore-case "searthtext"
파일 형식이 무엇인지 알면 검색 할 파일 형식 확장명을 지정하여 검색 범위를 좁힐 수 있습니다.이 경우 .pas
OR .dfm
files :
find . -type f \( -name "*.pas" -o -name "*.dfm" \) -print0 | xargs --null grep --with-filename --line-number --no-messages --color --ignore-case "searchtext"
옵션에 대한 간단한 설명 :
find
의 .
는 현재 디렉토리에서 지정합니다.-name
"-o -name "*.*
")에 대해 *.pas
"*.dfm
": *.pas
로 지정된 *.dfm
OR -o
파일, OR-type f
는 파일을 찾고 있음을 지정합니다.-print0
(파이프)의 반대편에있는 --null
와 |
은 find
에서 grep
에 xargs
파일 이름을 전달하여 파일 이름에 공백이있는 파일 이름이 전달되도록 허용하여 grep이 경로를 처리하도록 허용합니다 파일 이름을 하나의 문자열로 묶어서 각 공간에서 분리하지 않아야합니다.Silver Searcher는 훌륭한 도구이지만 ripgrep이 더 좋을 수도 있습니다.
Linux, Mac 및 Windows에서 작동하며 Hacker News 몇 달 전에 작성되었습니다 (이 링크는 Andrew Gallant의 GitHub 링크가있는 블로그 링크입니다).
시험:
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' {} \;
나는 Python 스크립트 를 작성했습니다. 이것이이 스크립트를 사용하는 방법입니다.
./sniff.py path pattern_to_search [file_pattern]
첫 번째 인수 인 path
은 재귀 적으로 검색 할 디렉토리입니다. 두 번째 인수 인 pattern_to_search
는 파일에서 검색하려는 정규 표현식입니다. 우리는 Pythonre
라이브러리에 정의 된 정규식 형식을 사용합니다. 이 스크립트에서 .
는 개행과도 일치합니다.
세 번째 인수 인 file_pattern
는 선택 사항입니다. 이것은 파일 이름에서 작동하는 또 다른 정규 표현식입니다. 이 정규식과 일치하는 파일 만 고려됩니다.
예를 들어, 확장명이 py
인 Pool(
다음에 Word Adaptor
을 포함하는 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
또한, 파일이 일치하는 경로와 일치하는 행 번호를 생성합니다. 둘 이상의 일치 항목이 발견되면 각 줄 번호가 파일 이름에 추가됩니다.
용도:
grep -c Your_Pattern *
그러면 현재 디렉토리의 각 파일에 패턴의 사본이 몇 개 있는지보고합니다.
grep은 이것을 달성하는 좋은 친구입니다.
grep -r <text_fo_find> <directory>
찾으려는 텍스트의 대소 문자를 신경 쓰지 않는다면
grep -ir <text_to_find> <directory>
모든 이전 답변은 grep을 제안하고 찾습니다. 하지만 또 다른 방법이 있습니다 : Use Midnight Commander
그것은 GUI가 아닌 시각적 인 무료 유틸리티 (30 년, 시간에 의해 입증)입니다. 그것은 많은 기능을 가지고 있으며 파일 찾기는 그 중 하나 일뿐입니다.
문자열을 검색하고 검색 문자열과 함께 해당 행만 출력하려면 다음과 같이하십시오.
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;
찾고있는 것을 정확하게 수행 할 수있는 ack
도구가 있습니다.
http://linux.die.net/man/1/ack
ack -i search_string folder_path/*
대소 문자를 구별하는 검색에 대해 -i
를 무시할 수 있습니다.
아래 명령은이 접근법에서 잘 작동합니다.
find ./ -name "file_pattern_name" -exec grep -r "pattern" {} \;
이 시도:
find . | xargs grep 'Word' -sl
나는 단순한 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'
'l'없이 '-r'을 사용하면 파일 이름 뒤에 패턴이있는 텍스트가 표시됩니다. !
grep -r 'pattern_to_find' /path/where/to/find
완벽하게 작동 ..
희망이 도움이됩니다!
아래 명령은 파일 이름을 원하지 않지만 모든 파일에서 검색하고자 할 때 사용할 수 있습니다. 여기에 "TEXT"형식을 캡처하는 중입니다. 모든 로그 파일은 파일 이름이 인쇄되지 않도록합니다.
grep -e TEXT *.log | cut -d' ' --complement -s -f1
grep with -e 옵션은 PATTERN match와 마찬가지로 다른 옵션에 비해 매우 빠릅니다.
번거 로움을 피하고 ack-grep을 설치하십시오. 그것은 많은 허가 및 인용 문제를 제거합니다.
apt-get install ack-grep
그런 다음 검색하려는 디렉토리로 이동하여 아래 명령을 실행하십시오.
cd /
ack-grep "find my keyword"
find
이 (가) xarg
이 (가) 가능한 많은 일치 항목이있을 때 선호됩니다. 다른 옵션보다 느리게 실행되지만 항상 작동합니다. 일부 사람들은 발견했듯이 xargs
은 기본적으로 공백이 포함 된 파일을 처리하지 않습니다. -d
옵션을 지정하면이를 극복 할 수 있습니다.
@ RobEarl의 대답은 다음과 같습니다.
find / -type f | xargs -d '\n' grep 'text-to-find-here'
여기 @ venkat의 대답도 비슷하게 향상되었습니다.
find . -name "*.txt" | xargs -d '\n' grep -i "text_pattern"
@Gert van Biljon의 답변은 다음과 같습니다.
find . -type f -name "*.*" -print0 | xargs -d '\n' --null grep --with-filename --line-number --no-messages --color --ignore-case "searthtext"
@ LetalProgrammer의 대답은 다음과 같습니다.
alias ffind find / -type f | xargs -d '\n' grep
@Tayab Hussain의 대답은 다음과 같습니다.
find . | xargs -d '\n' grep 'Word' -sl
검사 할 파일 집합이있는 경우 경로의 별칭을 지정할 수 있습니다 (예 :
alias fd='find . -type f -regex ".*\.\(inc\|info\|module\|php\|test\|install\|uninstall\)"'
그런 다음 간단히 목록을 다음과 같이 필터링 할 수 있습니다.
grep -U -l $'\015' $(fd)
리스트 fd를 CR 패턴을 포함하는 파일로 필터링합니다.
필자가 관심을 갖고있는 파일에 앨리어싱을 적용하면보다 쉬운 스크립트를 작성하고 항상 모든 파일을 가져 오는 방법을 기억하는 데 도움이됩니다. 반복적 인 작업은 잘 작동하지만 머지 않아 특정 파일 형식을 제거해야합니다. 그래서 내가 처음에 관심있는 모든 파일 형식을 찾았습니다.
엄격하게 find
을 사용하려면 다음을 수행하십시오.
find /path/to/somewhere/ -type f -exec grep -nw 'textPattern' {} \;
find + grep
1. 파일을 검색하려면 find
을 사용하고, 모두에 대해 grep
을 실행합니다.
다음과 같이 하나의 명령으로 결합 될 수 있습니다 :
find /path/to/somewhere/ -type f -exec grep -nw 'textPattern' {} \;
특정 파일 만 grep
하려는 경우 -name Pattern
를 사용하십시오.
find /path/to/somewhere/ -type f -name \*.cpp -exec grep -nw 'textPattern' {} \;
이렇게하면 find
을 사용하여 파일을 찾을 수 있습니다. 이 파일을 가지고 놀고 다른 find
옵션을 사용하여 파일 검색을 개선하거나 범위를 좁힐 수 있습니다.
이 시도:
find / -type f -name "*" -exec grep -il "String_to_search" {} \;
또는
for i in /*;do grep -Ril "String_to_search" $i;done 2> /dev/null
용도:
grep -Erni + "text you wanna search"
명령은 현재 디렉토리의 모든 파일과 디렉토리에서 재귀 적으로 검색하여 결과를 인쇄합니다.
주 : grep 출력이 색이 아닌 경우, 쉘 소스 파일에서 grep = 'grep - color = always'별명을 사용하여 변경할 수 있습니다.
다음 명령을 사용하여 파일에서 특정 텍스트를 찾을 수 있습니다.
cat file | grep 'abc' | cut -d':' -f2
앞의 대답에서 언급 한 Peter 와 같이 이전의 모든 대답은 grep을 제안하고 찾습니다.
그러나 Gnome Commander 와 완벽한 GUI를 사용하고 2001 년 이래로 수많은 옵션을 사용하는보다 정교한 방법이 있으며 파일 찾기는 그 중 하나 일뿐입니다. 그것은 시간에 의해 입증 된 무료 유틸리티입니다.
이 시도
find . -type f -name some_file_name.xml -exec grep -H PUT_YOUR_STRING_HERE {} \;
GUI 검색 대안 - 데스크탑 용 :
(질문은 정확하게 명령을 요구하지 않으므로
Searchmonkey : 정규 표현식을 사용하여 시스템을 색인하지 않고도 고급 파일 검색 도구. find/grep와 그래픽으로 동일합니다. Linux (Gnome/KDE/Java) 및 Windows (Java)에서 사용 가능 - 오픈 소스 GPL v3
특징 :
다운로드 - 링크 :
.
스크린 샷 :
당신의 명령은 정확합니다. grep에 -l을 추가하기 만하면됩니다.
find / -type f -exec grep -l 'text-to-find-here' {} \;