find
첫 번째 일치 항목을 찾은 후 명령을 강제로 중지하는 방법이 있습니까 ?
답변1
GNU 또는 FreeBSD의 경우 조건자를 find
사용할 수 있습니다 -quit
.
find . ... -print -quit
NetBSD에 find
해당:
find . ... -print -exit
이름만 인쇄하고 파일 이름에 개행 문자가 포함되어 있지 않다고 가정하면 다음을 수행할 수 있습니다.
find . ... -print | head -n 1
이는 첫 번째 게임 이후에는 멈추지 않지만 find
, 두 번째 게임의 타이밍과 버퍼링에 따라 또는 (훨씬) 나중에 멈출 수도 있습니다. 기본적으로 find
무언가를 출력하려고 할 때 SIGPIPE로 종료되며 head
입력의 첫 번째 줄을 읽고 표시했기 때문에 이미 종료되었습니다.
find
이 명령이 반환된 후 모든 쉘이 기다리는 것은 아닙니다 head
. Bourne 쉘 및 AT&T 구현 ksh
(비대화형인 경우) 및 yash
(파이프가 스크립트의 마지막 명령인 경우에만) 백그라운드에서 실행되지 않습니다. 어떤 셸에서든 이 동작을 확인하려면 언제든지 위의 내용을 다음과 같이 변경할 수 있습니다.
(find . ... -print &) | head -n 1
발견된 파일의 경로를 인쇄하는 것 이상의 작업을 수행하려면 다음을 시도할 수 있습니다.
find . ... -exec sh -c 'printf "%s\n" "$1"; kill -s PIPE "$PPID"' sh {} \;
( printf
파일로 원하는 것으로 바꾸십시오).
find
이는 종료 상태를 반환하는 부작용이 있으며 종료 상태를 반영합니다.
파이프라인의 일부가 신호에 의해 종료될 때 일부 쉘이 표시하는 메시지를 피하기 위해 기본 SIGTERM 신호 대신 SIGPIPE 신호를 보냅니다. SIGPIPE로 인한 사망은 자연적으로 발생하기 때문에(위와 같이 find | head
...) 일반적으로 이 작업을 수행하지 않습니다 .
답변2
find . -name something -print -quit
첫 번째 일치 항목을 인쇄한 후 검색을 종료합니다.
특정 수만큼 일치하면 검색을 종료하고 결과를 인쇄합니다.
find . -name something -print | head -n 5
놀랍게도 - head는 이제 5번의 일치 후에 문자열을 종료합니다. 하지만 방법과 이유는 모르겠습니다.
테스트하는 것은 매우 쉽습니다. 그냥 검색해 보세요ㅏ루트에서는 수천 개 이상의 일치 항목이 발생하며 최소 1분 이상이 소요됩니다. 그러나 "head"가 파이프되면 "find"는 지정된 횟수 후에 종료됩니다.철사head에 정의됩니다. 기본 head는 10을 표시하며 "head -n"을 사용하여 행을 지정합니다.
이는 "head -n"이 지정된 줄 바꿈 개수에 도달한 후에 종료되므로 여러 줄 바꿈을 포함하는 모든 일치 항목이 그에 따라 계산됩니다.
답변3
find를 실행할 때, 그 뒤에 use를 추가하십시오 -exec
. 그렇지 않으면 명령 실행이 생략됩니다. 예를 들어:-quit
\;
find -name "myfile*" -exec echo "Found {} and Quit" \; -quit
Found ./myfile1 and Quit
하지만 -quit을 사용하면앞으로-구현하다:
find -name "myfile*" -quit -exec echo "Found {} and Quit" \;
# Nothing was executed
답변4
-m
grep도 flag 와 함께 사용하면 반환되므로
find stuff | grep -m1 .
find에 의해 인쇄된 첫 번째 줄 이후에 반환됩니다.
이것의 차이점은 find stuff -print -quit | head -1
검색이 충분히 빠르면 grep이 제 시간에 프로세스를 중지하지 못할 수도 있지만(그러나 그것은 중요하지 않습니다), 검색이 길면 불필요한 많은 인쇄에서 find를 저장한다는 것입니다. 윤곽.
이는 busybox find와 함께 작동하지만, busybox grep도 지원하므로 -m
실제로는 필요하지 않습니다.
find /tmp/stuff -exec "sh" "-c" "eval 'echo {}; { kill \$PPID; }'" \;
이는 find 프로세스가 (보통) sigterm 신호를 수신했다는 메시지를 출력하지만 이 출력은 find 명령이 아닌 실행 중인 쉘에 속하므로 명령 출력을 방해하지 않습니다. 출력 행이 조회와 일치합니다.