it-swarm-ko.tech

find 명령에 exec 매개 변수에서 파이프를 사용하는 방법

두 개의 다른 실행 파일을 사용하여 디렉토리에서 많은 파일을 처리하는 find 명령을 구성하려고합니다. 불행히도 -exec 찾기에서 파이프를 사용하거나 심지어 \| 쉘이 해당 문자를 먼저 해석하기 때문입니다.

다음은 내가하려고하는 일입니다 (파이프가 find 명령을 끝내기 때문에 작동하지 않습니다) :

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

이 시도

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

또는 exec 문을 sh 스크립트 안에 포함시키고 다음을 수행 할 수 있습니다.

find -exec some_script {} \;
79
Martin Marconcini

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

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

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

might (테스트되지 않음)은 파일 목록을 xargs로 파이프하고 xargs는 jhead 명령 줄이 너무 길지 않도록 -exec를 사용하는 것보다 효과적입니다.

12
Palmin

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

-exec는 매우 비효율적입니다. 찾은 각 파일에 대해 명령을 다시 실행해야합니다. 이것을 피할 수 있다면 더 효율적일 것입니다. (예 : grep-exec 또는 Palmin 에서 제안한대로 find의 결과를 xargs로 파이핑

3
mweerden

이 유형의 작업에 find 명령을 사용하는 것이 최선의 대안은 아닙니다. 다음 명령을 자주 사용하여 요청 된 정보가 포함 된 파일을 찾습니다.

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

이렇게하면 목록이 출력되지 않습니다.

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을 넣으십시오.

1
Xetius

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

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

[email protected] findtest # find -type f -exec echo ls $"|" cat \;|sh
filename


[email protected] findtest # find -type f -exec echo ls $"|" cat $"|" xargs cat\;|sh
h

방금 시각화 한 방식 때문에 exec 내에서 파이프를 사용하는 OP의 원래 질문에 더 가깝다고 덧붙였습니다.

0
linuxgeek