이벤트 기반 디렉토리 구조가 있습니다.
이러한 이벤트에는 검색해야 하는 패턴이 포함되어 있거나 포함되어 있지 않은 파일 유형이 있습니다. 긍정적인 결과를 별도의 파일에 저장하고 싶습니다.
나의 첫 번째 접근 방식은 다음과 같습니다.
find . /EVENT*/'filename' | grep 'searchtext' head -2 > error_file
그러나 이것은 작동하지 않는 것 같습니다. 이 방법으로는 합칠 수 없다고 find
하는데 grep
어떻게 해야 하나요?
답변1
이것은 일반적인 패턴입니다:
find /directory/containing/files -type f -exec grep -H 'pattern_to_search' {} +
여기서는 find
필요한 파일이 포함된 디렉터리의 모든 파일이 먼저 검색됩니다. 이 경우 명령은 *.txt
다음과 같습니다..txt
find /directory/containing/files -type f -name "*.txt" -exec grep -H 'pattern_to_search' {} +
-exec grep -H 'pattern_to_search' {} +
필요한 파일을 찾은 후 -H
(패턴이 발견된 파일 이름을 인쇄합니다)를 사용하여 이 파일에서 필요한 패턴을 검색합니다. 여기서는 {}
검색하려는 파일이 포함된 것으로 생각할 수 있으며 , 한 번만 포크하면 명령 처럼 검색되도록 +
마지막에 사용해야 합니다 .-exec
-exec
grep
grep -H 'pattern_to_search' file_1.txt file_2.txt file_3.txt
답변2
또 다른 효과적인 접근 방식은 다음과 같습니다.
find /directory/containing/files -type f -print0 | xargs -0 grep "test to search"
print0 / 옵션 -0은 파일 이름 문자열에 공백과 같은 특수 문자가 포함된 경우를 허용합니다.
답변3
하나의 프로세스만 사용하는 방법도 있습니다( find
, , -exec
제외 xargs
).
grep -r "test to search" /directory/containing/files
어쨌든 GNU grep을 사용하세요. :)
ETA: 옵션을 표시하라는 요청을 받았으므로 grep --include
다음은 heemayl의 예와 유사한 예입니다("*.txt와 같은 와일드카드를 사용하여 .txt로 끝나는 파일만 찾을 수도 있습니다").
grep --include '*.txt*' -r "pattern to search" /directory/containing/files
편집할 때 그렇습니다. 이것은 직접 대체가 아닌 대안입니다. 이 명령은 심볼릭 링크를 통해 (일반) 파일을 읽습니다. (그렇지만 심볼릭 링크 디렉토리를 통해 재귀하지는 않습니다. 그러려면 그렇게 해야 합니다 -R
.) 또한 소켓, 명명된 파이프 및 장치 파일도 읽습니다(물론 -D skip
추가하거나 건너뛸 수는 있지만). 그리고 이와 같은 옵션의 효과를 얻을 수 있는 방법은 없습니다 grep
. 필요한 경우 - 사용하지 않으면 좋은 선택이라고 생각합니다.find
-mtime -2
find
grep
답변4
특정 패턴을 찾기 위해 텍스트 파일을 grep하고 하위 디렉터리를 반복해야 한다고 가정합니다. GNU grep을 사용하면 매우 간단합니다.
cd /to/the/top/level
grep -r "PatternToSearch" *
-r
-R
대신에 또는 를 사용할 수 있습니다 .--recursive
검색 패턴에 공백이 있으면 따옴표를 사용해야 합니다.
GNU grep에는 많은 옵션이 있습니다. 그냥 입력 grep --help
하면 놀랄 것입니다!