find 명령의 exec 매개변수에서 파이프를 어떻게 사용합니까?

StackOverflow https://stackoverflow.com/questions/62044

  •  09-06-2019
  •  | 
  •  

문제

두 개의 서로 다른 실행 파일을 사용하여 디렉터리에 있는 여러 파일을 처리하는 find 명령을 구성하려고 합니다.안타깝게도, -exec find에서는 파이프 사용을 허용하지 않거나 심지어 \| 쉘이 해당 문자를 먼저 해석하기 때문입니다.

구체적으로 내가 하려는 일은 다음과 같습니다(파이프가 find 명령을 끝내기 때문에 작동하지 않습니다).

find /path/to/jpgs -type f -exec jhead -v {} | grep 123 \; -print
도움이 되었습니까?

해결책

이 시도

find /path/to/jpgs -type f -exec sh -c 'jhead -v {} | grep 123' \; -print

또는 sh 스크립트 안에 exec 문을 삽입한 후 다음을 수행할 수 있습니다.

find -exec some_script {} \;

다른 팁

약간 다른 접근 방식은 xargs를 사용하는 것입니다.

find /path/to/jpgs -type f -print0 | xargs -0 jhead -v | grep 123

나는 항상 이해하고 적응하기가 조금 더 쉽다는 것을 알았습니다 (공백이 포함된 파일 이름에 대처하려면 -print0 및 -0 인수가 필요합니다)

이것 ~할 것 같다 (테스트되지 않음) -exec를 사용하는 것보다 더 효과적입니다. 왜냐하면 파일 목록을 xargs로 파이프하고 xargs는 jhead 명령줄이 너무 길어지지 않도록 하기 때문입니다.

와 함께 -exec 임의의 셸 명령이 아닌 일부 인수를 사용하여 단일 실행 파일만 실행할 수 있습니다.이를 피하려면 다음을 사용할 수 있습니다. sh -c '<shell command>'.

의 사용에 유의하십시오 -exec 상당히 비효율적입니다.발견된 각 파일에 대해 명령을 다시 실행해야 합니다.이를 방지할 수 있다면 더욱 효율적일 것입니다.(예를 들어, grep 외부 -exec 또는 결과를 파이핑 find 에게 xargs 에서 제안한대로 팔민.)

사용 find 이러한 유형의 작업에 대한 명령은 최선의 대안이 아닐 수도 있습니다.요청한 정보가 포함된 파일을 찾기 위해 다음 명령을 자주 사용합니다.

for i in dist/*.jar; do echo ">> $i"; jar -tf "$i" | grep BeanException; done

이것이 목록을 출력하므로 다음을 수행하지 않을 것입니다.

find /path/to/jpgs -type f -exec jhead -v {} \; | grep 123

또는

find /path/to/jpgs -type f -print -exec jhead -v {} \; | grep 123

find -exec의 결과에 grep을 추가하십시오.

당신이 할 수 있는 다른 방법이 있지만 그것은 또한 꽤 빈민가입니다.

셸 옵션 extquote를 사용하면 exec 항목을 찾은 다음 sh로 파이프하기 위해 이와 유사한 작업을 수행할 수 있습니다.

root@ifrit findtest # find -type f -exec echo ls $"|" cat \;|sh
filename


root@ifrit findtest # find -type f -exec echo ls $"|" cat $"|" xargs cat\;|sh
h

나는 적어도 내가 시각화한 방식이 exec 내에서 파이프를 사용하는 OP의 원래 질문에 더 가깝기 때문에 그것을 추가하겠다고 생각했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top