development

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

big-blog 2020. 10. 27. 22:48
반응형

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


두 개의 다른 실행 파일을 사용하여 디렉토리의 파일을 처리하는 찾기 명령을 구성하려고합니다. 불행히도 -execon 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 인수가 필요합니다)

이것은 파일 목록을 xargs로 파이프하고 xargs로 jhead 명령 줄이 너무 길어지지 않도록하기 때문에 -exec를 사용하는 것보다 더 효과적 일 수 있습니다 (테스트되지 않음).


을 사용 -exec하면 임의의 셸 명령이 아닌 일부 인수를 사용하여 단일 실행 파일 만 실행할 수 있습니다. 이를 우회하기 위해 sh -c '<shell command>'.

의 사용 -exec은 매우 비효율적입니다. 발견 된 각 파일에 대해 명령을 다시 실행해야합니다. 이것을 피할 수 있다면 더 효율적일 것입니다. (예를 들어 Palmin이 제안한대로 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의 원래 질문에 더 가깝기 때문에 추가 할 것이라고 생각했습니다.

참고 URL : https://stackoverflow.com/questions/62044/how-do-i-use-a-pipe-in-the-exec-parameter-for-a-find-command

반응형