IO 리디렉션

IO 리디렉션

중복 백업 시 무시되는 파일로 입력될 10G보다 큰 파일 목록을 생성해야 합니다. 그러나 읽을 수 있는 권한이 없는 일부 파일이 있습니다. 나중에 처리될 항목은 무시하고 "권한 거부" 메시지 없이 목록을 정리하고 싶습니다.

다음과 같이 목록을 만들 수 있습니다.

$ find data/ -size +10G
/data/bigfile1
find: `/data/badfile1': Permission denied
find: `/data/badfile2': Permission denied
/data/bigfile2

그런 다음 "Permission Denied" 또는 "Looking for:" 문자열이 포함된 줄을 제거해야 합니다. 목록 출력의 순서가 관련이 있는지는 잘 모르겠지만 제가 본 것은 그렇습니다. 여러 옵션을 시도하고 있지만 선을 제거할 수 없습니다. 나는 이 문제를 따르고 있는데 비슷해 보이지만 왜 작동하지 않는지 이해할 수 없습니다. https://stackoverflow.com/questions/3548453/negative-matching-using-grep-match-lines-that-do-not-contain-foo

먼저 grep을 사용하여 접근 방식을 시도하고 있습니다.

$ find data/ -size +10G | grep -v 'find:'
find: `/data/badfile1': Permission denied
/data/bigfile1
find: `/data/badfile2': Permission denied
/data/bigfile2

또한 awk를 사용하여:

$ find data/ -size +10G | awk '!/find:/'
find: `/data/badfile1': Permission denied
find: `/data/badfile2': Permission denied
/data/bigfile1
/data/bigfile2

그럼에도 불구하고 긍정적인 선택은 잘 작동합니다. 그래서 나는 무엇을 해야할지 모르겠습니다.

답변1

IO 리디렉션

문제는 스크립트에 있는 것이 아니라특징UNIX IO 리디렉션.

다음 명령을 고려하십시오

find data/ -size +10G | grep -v 'find:'

stdout스트림 만 파이프라인 grep명령으로 전송되며 오류 메시지는 별도의 출력 스트림에 있습니다 stderr.

따라서 터미널 세션에 오류 메시지가 표시되더라도 터미널은 stdoutstderr콘솔에 둘 다 인쇄하므로 grep명령은 다음과 같습니다.아니요다음 출력 라인을 수신합니다. 이는 |출력이 리디렉션되는 방식 때문입니다 . 파이프는 다음 명령에만 |연결되므로 다음 명령에는 들어가지 않습니다.stdoutstdinstderr

대부분의 *NIX유틸리티는 이러한 방식으로 작동하여 오류를 stderr출력 스트림에 보내므로 귀하와 같은 상황에서 이러한 메시지를 필터링할 필요가 없습니다.

시험

stdout위 명령이 전달될 때 정확히 어떤 일이 발생하는지 확인하려면 grep다음을 수행합니다.

find data/ -size +10G > out.txt

콘솔에는 여전히 오류가 표시되지만 stdout출력 스트림은 새 파일로 이동합니다 out.txt. 거기서 보면 오류 메시지 줄이 표시되지 않습니다.

관련 정보