find 명령에 대한 exec 매개 변수에서 파이프를 어떻게 사용합니까?
두 개의 다른 실행 파일을 사용하여 디렉토리의 파일을 처리하는 찾기 명령을 구성하려고합니다. 불행히도 -exec
on 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의 원래 질문에 더 가깝기 때문에 추가 할 것이라고 생각했습니다.
'development' 카테고리의 다른 글
/ etc / hosts에 와일드 카드 항목을 넣는 방법은 무엇입니까? (0) | 2020.10.27 |
---|---|
만드는 방법 (0) | 2020.10.27 |
O (N log N) 복잡성-선형과 유사합니까? (0) | 2020.10.27 |
PHP에서 정적 변수 / 함수를 언제 사용합니까? (0) | 2020.10.27 |
TextBox에서 Enter 키 캡처 (0) | 2020.10.27 |