find -exec를 실행하는 방법?


답변:


710

;( \;쉘이 해석하지 못하도록 이스케이프 처리 ) 또는 a +및 a를 놓쳤습니다 {}.

find . -exec grep chrome {} \;

또는

find . -exec grep chrome {} +

find찾은 파일 이름 을 실행 grep하고 대체 {}합니다. 차이 ;+함께이다 ;grep각 파일에 대한 명령으로 실행하는 반면 +많은 수의 파일을 파라미터로 주어진대로 grep한번에.


30
\를 사용하면; 종료 구문 grep은 한 번에 하나의 파일로 전달되므로 기본적으로 파일 이름이 표시되지 않고 일치하는 행만 표시됩니다. 대신 파일 목록을 얻으려면 grep -lsfind 구문 안에 use를 추가하십시오 .
Caleb

9
find . -exec grep foo {} +다음과 같이 출력됩니다./dir/file.py:from foo import bar
sg

10
find . -exec grep foo {} \;다음과 같이 출력됩니다from foo import bar
sg

9
find . -exec grep -l foo {} +다음과 같이 출력됩니다./dir/file.py
sg

8
find . -exec grep -l foo {} \;다음과 같이 출력됩니다./dir/file.py
sg

46

find이것을 위해 전혀 사용할 필요는 없습니다 . grep은 현재 디렉토리의 모든 목록에서 파일 열기를 처리 할 수 ​​있습니다.

grep chrome *

... 또는 폴더와 그 아래의 모든 항목에 대해 재귀 적으로 :

grep chrome . -R

22
확장이 ARG_MAX를 초과하면 grep이 질식합니다. -R은 find를 사용하는 동안 모든 파일을 방문하여 특정 파일 (-name 등)을 제외하기 위해 프리미티브를 더 쉽게 추가하거나 하위 트리 (-prune)를 방문하지 않을 수도 있습니다.
Mel

6
좋은 점 @ 멜. 내 요점은 요청 당사자가 작업을 수행 findgrep수 있는 시간을 소개함으로써 필요한 것보다 복잡하게 만드는 것이지만 경우에 따라 찾기 전에 파일 목록을 정교하게 정리하는 것이 더 효과적이라는 것이 내 요점이었습니다 grep.
Caleb

4
grep이러한 경우 @Mel 은 질식하지 않습니다 exec.
Chris Down

모든 파일이 동일한 디렉토리에있는 경우에만 작동하며 하위 디렉토리에 분산 된 경우에는 작동하지 않습니다.
Yaba

1
@ Yaba 내 대답은 하위 디렉토리에 파일이 확산 된 경우를 처리하는 방법을 설명합니다.
Caleb

18
find . | xargs grep 'chrome'

당신은 또한 할 수 있습니다 :

find . | xargs grep 'chrome' -ls

첫 번째는 파일의 행을 보여주고 두 번째는 파일을 나열합니다.

Caleb의 옵션은 깔끔하고 키 입력 횟수가 적습니다.


11
문제 xargs는 입력이 find생산되지 않는 독특한 방식으로 인용 될 것으로 예상한다는 것 입니다. 그래서 find … | xargs …당신이 공백 또는를 포함하는 파일 이름이있는 경우 작동하지 않습니다 \'".
Gilles

3
@Gilles 당신은 find . | xargs -n1 -iX grep "X" 'chrome'인수가 한 번에 하나씩 제공되고 인용되도록 같은 것을 사용하여 그 문제를 해결할 수 있습니다 . 분명히 이것은이 예제를 처리하는 끔찍한 비효율적 인 방법이지만 일부 상황에서는 좋습니다.
Caleb

완전성을 위해 'grep'의 대소 문자를 구분하지 않는 -i 옵션도 언급해야합니다. 또한 대소 문자를 구분하지 않기 위해 찾기에 -iname이 있습니다.
Mathew

9
@Caleb : NUL을 구분자로 사용하여 xargsLinux 파일 이름 을 처리 하는 유일한 100 % 신뢰할 수있는 방법 은 find ... -print0 | xargs -0입니다. 대안 xargs -d '\n'-99 %의 신뢰성으로 줄 바꿈 기호를 구분 기호로 사용합니다.
grawity

나는 이것을 자주 사용하지만 매우 긴 파일 이름 목록에서는 실패합니다.이 시점에서 find -exec가 승자가됩니다.
Spacemoose

5

한 방법입니다 찾기 당신은 시도 할 수 있습니다 the_silver_searcher당신이 할 필요가있다

ag chrome

모든 파일 (하위 디렉토리 포함)에서 크롬을 검색하고 찾기보다 빠릅니다.


IMHO가 더 빨리 작업을 수행하는 pt ( plathub.com/monochromegane/the_platinum_searcher 에서 사용 가능한 백금 검색기)도 있습니다 . 파일이 적더라도 중요하지 않을 수 있습니다.
호핑 토끼


1

다음은 일반적으로 find / exec를 사용하는 방법의 예입니다.

find  . -name "*.py" -print -exec fgrep hello {} \;

이것은 모든 .py 파일을 재귀 적으로 검색하고, 각 파일마다 파일 이름과 fgrep를 해당 파일에서 'hello'로 출력합니다. 출력은 다음과 같습니다 (오늘 실행했습니다).

./r1.py
./cgi-bin/tst1.py
print "hello"
./app/__init__.py
./app/views.py
./app/flask1.py
./run.py
./tst2.py
print "hello again"

1
워크 플로를 망칠 필요는 없지만 다음과 같이 할 수 있습니다 find . -name "*.py" -exec fgrep -l hello {} \; .-일치하는 파일의 파일 이름을 인쇄합니다.
Jeff Schaller
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.