찾기를 사용하여 처음 몇 개의 일치하는 파일 만 찾으십니까?


17

*.txt디렉토리에 수백 개의 파일 이 있다고 가정하십시오 . 처음 세 *.txt파일 만 찾은 다음 검색 프로세스를 종료하고 싶습니다 .

find유틸리티를 사용하여이를 달성하는 방법은 무엇입니까? 나는 매뉴얼 페이지를 빨리 보았지만, 그런 옵션이 아닌 것 같습니다.


3
find . -name '*.txt' -print -quit첫 번째 일치 만 표시하고 첫 번째 일치 find후에 종료 할 수 있습니다 . "n 개의 일치 항목을 찾은 후 종료"하는 경우에 적응할 수 있는지 여부를 모르겠습니다.
NN

답변:


22

find통해 출력을 파이프 할 수 있습니다 head.

find . -name '*.txt' | head -n 3

2
나는 이것을 알고 있었고, 처음 세 개의 일치하는 파일을 찾은 후 검색 프로세스를 종료하고 싶습니다. 상관없는 일치하는 파일이 엄청나게 많을 수 있습니다.
mitnk

2
헤드가 처음 3 개의 파일을 인쇄하면 find 명령이 종료되는 것 같습니다
Chris Card

1
예, 이상합니다.하지만 그렇습니다.
mitnk

19
전혀 이상하지는 않습니다. UNIX에서 파이프가 작동하는 방식입니다. head파이프의 왼쪽에서 입력을 기다립니다. 그런 다음 find지정된 기준과 일치하는 파일을 시작하고 검색하여 파이프를 통해 출력을 보냅니다. 경우 head요청 라인들의 수를 수신하여 인쇄되고, 상기 배관을 개폐 종료한다. find닫힌 파이프를 확인하고 종료합니다. 간단하고 우아하며 효율적입니다.
D_Bye

3
요약하면, -n 3이다 POSIX 호환 , 따라서 가능성이 더 이식 할 수 있습니다.
l0b0

4

이 다른 대답 은 다소 결함이 있습니다. 명령은

find . -name '*.txt' | head -n 3

그런 다음 주석 [강조] 중 하나에 설명 이 있습니다 .

head파이프의 왼쪽에서 입력을 기다립니다. 그런 다음 find지정된 기준과 일치하는 파일을 시작하고 검색하여 파이프를 통해 출력을 보냅니다. 경우 head요청 라인들의 수를 수신하여 인쇄되고, 상기 배관을 개폐 종료한다. find닫힌 파이프를 확인하고 종료합니다. 간단하고 우아하며 효율적 입니다.

이것은 거의 사실입니다.

문제는 find닫힌 파이프가 쓰려고 할 때만 닫힌 파이프입니다.이 경우에는 네 번째 일치 항목이 발견 된 것입니다. 그러나 4 번째 경기가 없으면 find계속 진행됩니다. 당신의 껍질은 기다릴 것입니다! 스크립트에서 발생하면 파이프 출력이 최종적이고 아무것도 추가 할 수 없다는 것을 이미 알고 있음에도 불구하고 스크립트가 대기합니다. 그렇게 효율적이지 않습니다.

이 특정 기능 find이 빠르게 완료 되면 큰 파일 트리에서 복잡한 검색을 수행하면 명령이 다음에 수행하려는 작업을 불필요하게 지연시킬 수 있습니다.

완벽하지 않은 솔루션은 실행하는 것입니다.

( find … & ) | head -n 3

이 방법으로 head종료하면 쉘이 즉시 계속됩니다. 백그라운드 find프로세스는 무시되거나 (조만간 종료 될 수 있음) 또는 대상으로 지정 pkill될 수 있습니다.


개념을 증명하기 위해 검색 할 수 있습니다 /. 우리는 하나의 경기 만 기대하지만 find어디에서나 찾으면 많은 시간이 걸릴 수 있습니다.

find / -wholename / 2>/dev/null | head -n 1

문제가 보이면 Ctrl+ C로 종료 하십시오. 이제 비교하십시오 :

pidof find ; ( find / -wholename / 2>/dev/null & ) | head -n 1 ; pidof find
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.