find + exec 명령의 출력을 파이프로 보내는 가장 좋은 방법은 무엇입니까?

find + exec 명령의 출력을 파이프로 보내는 가장 좋은 방법은 무엇입니까?

추가 처리를 위해 find + exec 명령의 출력을 파이프로 올바르게 보내는 방법을 알고 싶습니다.

즉, 어떻게
(1) 그룹 파일을 선택하고
(2) exec를 통해 그룹에 대한 일부 작업을 수행하고
(3) 해당 작업의 출력을 파이프라인에 있는 하나 이상의 필터에 대한 입력으로 사용합니까?

예를 들어, 이와 같은 find + exec 명령을 필터링하려고 하면 필터링된 행에 "신호 13에 의해 종료됨" 오류가 많이 표시됩니다.

$ find c* -name "*.jpg" -exec ls {} \; | head
c0/1467058201899.jpg
c0/1465854461118.jpg
c0/1465855196637.jpg
c0/1467050962421.jpg
c0/1465856476225.jpg
c0/1467050385287.jpg
c0/1465853696999.jpg
c0/1467144293032.jpg
c0/1467051637981.jpg
c0/1465841226352.jpg
find: `ls' terminated by signal 13
find: `ls' terminated by signal 13
find: `ls' terminated by signal 13
...

이 특정 오류를 이렇게 없앨 수는 있지만 그다지 우아하다고 느껴지지는 않습니다.

$ find c* -name "*.jpg" -exec ls {} \; -print 2>/dev/null | head
c0/1467058201899.jpg
c0/1467058201899.jpg
c0/1465854461118.jpg
c0/1465854461118.jpg
c0/1465855196637.jpg
c0/1465855196637.jpg
c0/1467050962421.jpg
c0/1467050962421.jpg
c0/1465856476225.jpg
c0/1465856476225.jpg

find + exec의 일반적인 경우 실행되는 명령이 다를 수 있습니다. 이를 수행하는 더 우아한 방법이 있습니까?

고쳐 쓰다
xargs를 사용하면 여전히 stderr로 출력이 생성되는 것 같습니다.

$ find c* -name "*.jpg" -print0 | xargs -0 ls | head
c0/1465425913832.jpg
c0/1465425968779.jpg
c0/1465426112741.jpg
c0/1465426116540.jpg
c0/1465426121623.jpg
c0/1465426127656.jpg
c0/1465426133584.jpg
c0/1465426140097.jpg
c0/1465426143185.jpg
c0/1465426156715.jpg
xargs: ls: terminated by signal 13

대신 +로 종료하는 find + exec를 사용하면 stderr에 출력이 생성됩니다.

$ find c* -name "*.jpg" -exec ls {} \+ | head
c0/1465425913832.jpg
c0/1465425968779.jpg
c0/1465426112741.jpg
c0/1465426116540.jpg
c0/1465426121623.jpg
c0/1465426127656.jpg
c0/1465426133584.jpg
c0/1465426140097.jpg
c0/1465426143185.jpg
c0/1465426156715.jpg
find: `ls' terminated by signal 13
find: `ls' terminated by signal 13

이 명령에 "-print 2>/dev/null"을 추가하면 명령이 매우 빠르게 실행되지만...

$ find c* -name "*.jpg" -exec ls {} \+ -print 2>/dev/null | head
c0/1467058201899.jpg
c0/1465854461118.jpg
c0/1465855196637.jpg
c0/1467050962421.jpg
c0/1465856476225.jpg
c0/1467050385287.jpg
c0/1465853696999.jpg
c0/1467144293032.jpg
c0/1467051637981.jpg
c0/1465841226352.jpg

답변1

find언제 멈춰야 할지 모르기 때문에 오류가 발생합니다 . 를 실행하면 find | headhead가 10줄을 얻고 종료할 때 다음에 find파일 이름을 쓰려고 할 때 다음과 같은 메시지를 받게 됩니다.신호 파이프라인(파이프의 다른 쪽 끝이 부러졌거나 닫혀 있음을 알려줍니다.) find는 우아하게 종료됩니다.

하지만 여기서 find는 아무것도 쓰지 않습니다 ls. find자식이 죽어가는 것을 볼 수 있고 그 이유를 알고 있지만 파이프의 다른 쪽 끝이 닫혀 있다는 사실도 모르고 자식 생성을 중지하는 방법도 모릅니다.

관련 정보