GREP가 "0.jpg"라는 단일 파일 대신 바이너리 파일을 출력하는 이유는 무엇입니까?

GREP가 "0.jpg"라는 단일 파일 대신 바이너리 파일을 출력하는 이유는 무엇입니까?

나는 BASH를 좋아하지만 GREP에 어려움을 겪고 있습니다.

내 목표는 간단합니다. 데스크톱 파일의 GREP "0.jpg"입니다.

내 BASH 코드:

$ pwd
/Users/jennalusche/Desktop
$ grep "0" *.jpg

예상되는 결과:

0.jpg

실제 결과:

Binary file IMG_2125.jpg matches
Binary file the-letter-just-j-bw-vectorized-v2.jpg matches

운영 체제

맥 OS X 요세미티

내 질문

GREP "0" *.jpg가 "0.jpg"라는 단일 파일 대신 바이너리 파일을 표시하는 이유는 무엇입니까?

내 디버깅 원칙

나는 이 파일들이 나타나는 이유가 그것들이 모두 "바이너리"이기 때문이라고 가정합니다. "바이너리 파일" = 0과 1로 인코딩된 파일. 따라서 표시된 두 파일은 모두 0으로 변환되어야 하고 내 PWD의 다른 모든 파일은 1로 변환됩니다.

나의 당연한 질문 -

출력이 0.jpg가 아닌 이유는 무엇입니까?

이유 확인

두 출력 파일(이진 형식)은 모두 0이고 PWD의 다른 모든 파일은 1이라고 가정합니다. 이 가정이 맞나요?

토끼굴로 떨어지다——

생성된 파일이 모두 0인 이유는 무엇입니까? 저는 의도적으로 이 파일들을 특별한 방법으로 인코딩하지 않았습니다. 파일이 1로 인코딩된 GREP 검색에 표시되지 않습니까? 그렇다면 왜 그렇습니까?

토끼 굴 속으로 더 깊이 굴러가며— 그렙. SED. AWK. L.S. 고양이. 에코. 찾다.

분명히 이러한 유틸리티의 기능에는 중복되는 부분이 많이 있습니다.

활용면에서 가장 마음에 드는 조합은 무엇인가요?

답변1

grep실용적인 사항파일 내부를 살펴보세요정규식과 일치하는 줄입니다.

당신이 원하는 것은 0이름이 (0)이고 접미사가 ​​인 현재 디렉토리의 파일을 나열하는 것입니다 .jpg.

ls -l ./*0*.jpg

아니면 실제로 그냥

echo ./*0*.jpg

패턴의 첫 번째 부분은 *0*0을 포함하는 모든 문자열과 일치하는 반면, 패턴의 마지막 부분은 .jpg생성된 파일 이름을 해당 접미사로 끝나는 파일 이름으로 제한합니다. 이는 ./"이 디렉터리에 있음"을 의미하며 파일 이름이 (대시)로 시작하는 경우에만 실제로 필요합니다 -(그렇지 않으면 명령줄 옵션으로 잘못 해석될 수 있음).

이 패턴의 확장은 호출 전에 쉘에 의해 수행되므로 ls패턴 ls과 일치하는 파일 이름의 확장된 목록이 얻어지고 나열됩니다.

파일 이름 와일드카드 패턴은 정규식이 아닙니다.비슷한줘). grep반면에 하나 이상의 정규식을 사용하여 파일 콘텐츠에서 검색하세요.


발견된 질문에 답변하기댓글에서: "경고"는 치명적이지 않은 형태입니다.진단산출. 다른 유형은 "오류"로, 일반적으로 치명적입니다(즉, 프로그램이 평소처럼 계속될 수 없으며 오류 메시지를 출력한 후 종료됩니다).

진단 메시지는 일반적으로 정상 작동 중 명령에 의해 생성된 표준 출력의 일부로 간주되지 않으며 일반적으로 특수한 "출력 스트림"("표준 출력 스트림"이 아닌 소위 "표준 오류 스트림")에서 생성됩니다. ) 독립적으로 확인하거나 삭제할 수 있고 명령의 정상적인 출력을 방해하지 않도록 합니다.

하지만 이 경우에는 grep실제로 불가능합니다.전시하다패턴과 일치하는 데이터는 파일이 바이너리이고 데이터가 인쇄할 수 없을 가능성이 높기 때문에 파일에 일치 항목이 있다는 메시지를 통해 알려줍니다. Binary file IMG_2125.jpg matches이는 실제로 진단 경고 메시지가 아닙니다.마이크 셀프가 제안하는 것).


1 일부 echo구현에서는 일부 파일 이름에 백슬래시 문자가 포함된 경우 확장을 위한 이스케이프 시퀀스로 해석합니다 \n.\b

관련 정보