작동하지 않습니다. 이것을 찾아서 할 수 있습니까? 아니면 xargs해야합니까?
find -name 'file_*' -follow -type f -exec zcat {} \| agrep -dEOE 'grep' \;
답변
파이프 기호를 여러 프로세스를 실행하고 한 프로세스의 출력을 다른 프로세스의 입력으로 파이프하는 명령으로 파이프 기호를 해석하는 작업은 쉘 (/ bin / sh 또는 이와 동등한)의 책임입니다.
예를 들어 최상위 쉘을 사용하여 다음과 같이 배관을 수행하도록 선택할 수 있습니다.
find -name 'file_*' -follow -type f -exec zcat {} \; | agrep -dEOE 'grep'
효율성 측면에서이 결과는 한 번의 찾기 호출, zcat의 여러 호출 및 한 번의 agrep 호출 비용이 듭니다.
이로 인해 단일 agrep 프로세스 만 생성되고 zcat의 수많은 호출로 생성 된 모든 출력을 처리합니다.
어떤 이유로 든 agrep을 여러 번 호출하려면 다음을 수행하십시오.
find . -name 'file_*' -follow -type f \
-printf "zcat %p | agrep -dEOE 'grep'\n" | sh
파이프를 사용하여 명령 목록을 구성한 다음 실제로 실행할 새 셸로 보냅니다. (마지막 “| sh”를 생략하면 이와 같은 명령 행을 디버그하거나 실행하는 좋은 방법입니다.)
효율성 측면에서이 결과는 찾기 한 번의 호출, sh 한 번의 호출, zcat의 수많은 호출 및 수많은 agrep 호출의 비용이 듭니다.
명령 호출 수 측면에서 가장 효율적인 솔루션은 Paul Tomblin의 제안입니다.
find . -name "file_*" -follow -type f -print0 | xargs -0 zcat | agrep -dEOE 'grep'
… 한 번의 찾기 호출, xargs의 호출, zcat의 호출 및 agrep의 호출이 필요합니다.
답변
해결책은 쉽다 : sh를 통해 실행
... -exec sh -c "zcat {} | agrep -dEOE 'grep' " \;
답변
find . -name "file_*" -follow -type f -print0 | xargs -0 zcat | agrep -dEOE 'grep'
답변
찾은 while
파일에서 여러 작업을 수행 할 수 있는 루프로 파이프 할 수도 있습니다 find
. 그래서 여기 jar
에 jar
파일 의 큰 배포판이있는 폴더의 주어진 Java 클래스 파일에 대한 아카이브 를 찾는 것이 있습니다
find /usr/lib/eclipse/plugins -type f -name \*.jar | while read jar; do echo $jar; jar tf $jar | fgrep IObservableList ; done
요점은 while
루프에 세미콜론으로 구분 된 전달 된 파일 이름을 참조하는 여러 명령이 포함되어 있으며 이러한 명령에는 파이프가 포함될 수 있다는 것입니다. 따라서이 예제에서는 일치하는 파일 이름을 에코 한 다음 지정된 클래스 이름에 대해 아카이브 필터링에있는 항목을 나열합니다. 결과는 다음과 같습니다.
/usr/lib/eclipse/plugins/org.eclipse.core.contenttype.source_3.4.1.R35x_v20090826-0451.jar /usr/lib/eclipse/plugins/org.eclipse.core.databinding.observable_1.2.0.M20090902-0800 .jar org / eclipse / core / databinding / observable / list / IObservableList .class /usr/lib/eclipse/plugins/org.eclipse.search.source_3.5.1.r351_v20090708-0800.jar / usr / lib / eclipse / plugins / org.eclipse.jdt.apt.core.source_3.3.202.R35x_v20091130-2300.jar /usr/lib/eclipse/plugins/org.eclipse.cvs.source_1.0.400.v201002111343.jar / usr / lib / eclipse / plugins / org.eclipse.help.appserver_3.1.400.v20090429_1800.jar
내 bash 쉘 (xubuntu10.04 / xfce) fgrep
에서 일치하는 문자열을 강조 표시하면 일치 하는 클래스 이름을 굵게 표시합니다. 이렇게하면 jar
검색된 수백 개의 파일 목록을 검색하고 일치하는 항목을 쉽게 볼 수 있습니다.
Windows에서는 다음과 같은 작업을 수행 할 수 있습니다.
for /R %j in (*.jar) do @echo %j & @jar tf %j | findstr IObservableList
Windows에서 명령 구분 기호는 ‘&’not ‘;’입니다. 그리고 ‘@’은 위의 linux find 출력과 같이 깔끔한 출력을 제공하는 명령의 에코를 억제합니다. 하지만 findstr
당신이 일치하는 클래스 이름을보고 조금 더 가까이 출력에서 볼 필요가 있도록 일치하는 문자열 굵게 표시되지 않습니다. Windows ‘for’명령은 텍스트 파일을 반복하는 것과 같은 몇 가지 트릭을 알고 있습니다 …
즐겨
답변
문자열 셸 명령 (sh -c)을 실행하는 것이 가장 좋습니다. 예를 들면 다음과 같습니다.
find -name 'file_*' -follow -type f -exec bash -c "zcat \"{}\" | agrep -dEOE 'grep'" \;
답변
간단한 대안을 찾고 있다면 루프를 사용하여 수행 할 수 있습니다.
for i in $(find -name 'file_*' -follow -type f);do zcat $i | agrep -dEOE 'grep');done
또는보다 일반적이고 이해하기 쉬운 형태 :
for i in $(YOUR_FIND_COMMAND);do YOUR_EXEC_COMMAND_AND_PIPES );done
YOUR_EXEC_COMMAND_AND_PIPES에서 {}를 $ i로 바꿉니다.