파이프 및 앰 퍼와 함께 grep을 사용하여 찾기에서 오류 필터링 다음 명령이 작동합니다. find -name ‘myfile.*’ |&

cygwin을 사용하여 cygdrive에서 파일을 찾습니다.

그러나 권한 거부 메시지를 억제해야합니다 (그렇지 않으면 오류 메시지에 결과가 숨겨 짐). 다음 명령이 작동합니다.

find -name 'myfile.*' |& grep -v "Permission denied"

앰퍼샌드 가이 명령에 들어가야하는 이유를 이해하지 못하지만 이것이 작동 할 것으로 예상했지만 작동하지 않습니다.

find -name 'myfile.*' | grep -v "Permission denied"

앰퍼샌드의 의미를 설명하십시오.



답변

유닉스 계열 시스템에는 수정되지 않은 상태로두면 출력이 화면에 전송되는 두 개의 출력 경로가 있습니다. 표준 오류 (또는 표준 오류)는 대부분의 오류와 오류 조건을 캡처하는 오류입니다.

stderr의 권한 거부 메시지를 “일반 출력”과 동일한 출력 스트림으로 전달하려면 둘을 결합해야합니다. 예를 들어, grep -v제대로 작동 하기 위해 stdout (표준 출력)과 stderr을 비전 구문과 결합합니다.

에서 GNU 배쉬 매뉴얼 섹션 3.2.2 파이프 라인 :

|&‘를 사용하면 표준 출력과 함께 command1 의 표준 오류 가 파이프를 통해 command2 의 표준 입력에 연결됩니다 . 에 대한 속기입니다 2>&1 |. 표준 오류를 표준 출력으로 암시 적으로 재지 정하는 것은 명령에 의해 지정된 재 지정 후에 수행됩니다.

또한 geirha가 지적했듯이 stderr 출력을 제거하려면 다음과 같은 작업을 수행하십시오.

find -name 'myfile.*' 2> /dev/null

또는 아마도

find -name 'myfile.*' 2> /tmp/errorlog

또한 find출력을 전달하는 등의 명령 문자열이있는 경우 명령의 xargs모든 구성 요소에서 출력을 캡처하려면 전체 명령 파이프 라인을 괄호 안에 넣어야합니다. 예 :

(find | egrep ^[RS].[0-9]+/.svg] | xargs head -1 )  2> /dev/null

괄호를 생략하고 대신 수행 한 경우-

find | egrep ^[RS].[0-9]+/.svg] | xargs head -1 2> /dev/null

find 또는 egrep에서 권한 거부 오류가 계속 표시되지만 xargs에 대해 stderr이 경로 재 지정됩니다.

보시다시피 테스트 실행 중에 내용을 본 후에 만 ​​stderr를 버릴 것입니다.

GNU find와 POSIX 호환 가능한 한 find, -print옵션은 암시 적입니다. 원하는 경우 명시 적으로 제공 할 수 있습니다.


답변

오류 메시지는 stdout이 아닌 stderr 에 기록 되지만 파이프는 stdout 에만 있습니다.|

당신은 아마 원하는 |&, 파이프가있는 stderr에 뿐만 아니라 표준 출력 .


답변

오류 메시지를 무시하려면 stderr을 / dev / null로 리디렉션하십시오.

find . -name 'myfile.*' -print 2>/dev/null

또한 http://mywiki.wooledge.org/UsingFind를 읽어보십시오 .


답변