Linux는 파이프라인에서 '찾기'를 적용할 수 없습니다.

Linux는 파이프라인에서 '찾기'를 적용할 수 없습니다.

아래 디렉토리 트리에서 파일을 검색하고 있습니다. 시도하면 find . -name xyz화면이 가득 찼습니다.find: '/home/fred' : Permission denied

나는 이 디렉토리에 접근할 수 없기 때문에 이는 의미가 있습니다. 그래서 난 노력해

find . -name xyz | grep -v Permission 

이렇게 하면 원하지 않는 행이 제거됩니다. 글쎄, 내 화면은 이전과 똑같습니다. grep은 아무것도 하지 않습니다

어떻게 되어가나요? 어떻게 해결할 수 있나요?

답변1

"권한이 거부되었습니다"는 경고이며 예상하는 데이터 종류가 아닙니다 find. 요청된 사용자 데이터에서 오류 메시지를 분리하기 위해 find파일 이름은 표준 출력 채널 1에 인쇄되고 경고는 표준 오류 채널 2에 인쇄됩니다. 이 동작은 많은 UNIX 명령줄 도구에서 매우 일반적입니다. 셸에는 일반적으로 두 개의 채널이 표시됩니다. /dev/null다음 과 같이 표시되는 void와 같이 오류 스트림을 다른 곳으로 명시적으로 리디렉션하여 이를 방지할 수 있습니다.

find . -name xyz 2>/dev/null

답변2

문제는 표준 출력에서 ​​오류 메시지를 필터링(제거)하려고 한다는 것입니다 find. 오류 메시지(일반 진단 메시지 및 대화형 프롬프트 포함)는 표준 오류 스트림에 표시되며 파이프될 수 없습니다. 따라서 grep표준 오류 스트림을 표준 출력 스트림에 병합하지 않고는 오류 메시지를 억제할 수 없습니다.

GNU 사용 find(비표준 -readable테스트 구현):

find . -type d ! -readable -prune -o -name xyz -print

xyz이는 현재 디렉토리 또는 그 아래에서 호출된 모든 항목을 찾고 발견된 경로 이름을 인쇄합니다. find현재 사용자에게 읽기 권한이 없는 디렉토리가 발견될 때마다 해당 디렉토리는 검색 트리에서 제거됩니다(검색 트리는손질된그리고 -prune).

이렇게 하면 액세스할 수 없는 디렉터리에 액세스하려고 할 때 발생하는 "권한 거부" 오류가 제거됩니다. 이는 단순히 이러한 오류가 발생할 수 있는 상황에 빠지지 않음으로써 수행됩니다.

이렇게 하면 문자 그대로 grep이름이 지정된 디렉터리에 있는 파일을 실수로 필터링하는 일도 방지할 수 있습니다 Permission.다른xyz검색 (오류가 무엇이든)할 때, find ... -exec ...실행 시 오류 흐름을 사용해야 하는 인라인 스크립트를 작성할 때, 또는 find ... -ok ...특정 작업을 수행하기 전에 사용자에게 확인을 요청할 때 생성될 수 있는 오류입니다 .

관련 정보