나는 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