파일을 "바이너리" 또는 "텍스트"로 분류하는 편리한 방법이 있습니까?

파일을 "바이너리" 또는 "텍스트"로 분류하는 편리한 방법이 있습니까?

grep와 같은 표준 Unix 유틸리티는 diff일부 경험적 방법을 사용하여 파일을 "텍스트" 또는 "바이너리"로 분류합니다. (예를 들어 grep의 출력에는 다음과 같은 줄이 포함될 수 있습니다 Binary file frobozz matches.)

zsh유사한 "텍스트/이진" 분류를 수행하기 위해 스크립트에 적용 할 수 있는 편리한 테스트가 있습니까 ? (그런 것 빼고요 grep '' somefile | grep -q Binary.)

(나는 그러한 테스트가 필연적으로 경험적이므로 불완전하다는 것을 알고 있습니다.)

답변1

file요청만 하시면무언극 유형text/x-shellscript등 다양한 내용이 나오겠지만 application/x-executable, "text" 부분만 확인하시면 꽤 좋은 결과를 얻으실 수 있을 것 같습니다. 예를 들어( -b출력에 파일 이름이 없음):

file -b --mime-type filename | sed 's|/.*||'

답변2

또 다른 방법 isutf8더 많은 유틸리티모으다.

파일이 유효한 UTF-8 또는 ASCII이거나 단락된 경우 0으로 종료 -q하고 오류 메시지를 인쇄하고(무음으로) 그렇지 않으면 1로 종료합니다.

답변3

GNU에서 사용하는 경험적 방법을 선호한다면 grep다음을 사용할 수 있습니다.

isbinary() {
  LC_MESSAGES=C grep -Hm1 '^' < "${1-$REPLY}" | grep -q '^Binary'
}

그것파일에서 읽은 첫 번째 버퍼에서 NUL 바이트를 검색합니다.(일반 파일의 경우 몇 킬로바이트이지만 /dev/random파이프나 소켓 또는 일부 장치(예:)의 경우 훨씬 적을 수 있습니다). UTF-8 로케일에서는 유효한 UTF-8 문자를 형성하지 않는 바이트 시퀀스도 표시합니다. LC_ALL영어 이외의 언어로 설정되지 않은 내용을 가정합니다 .

이 양식을 사용 하면 전역 한정자 ${1-$REPLY}로 사용할 수 있습니다 .zsh

ls -ld -- *(.+isbinary)

나열됩니다바이너리문서.

답변4

file--mime-encoding파일 인코딩을 감지하는 옵션이 있습니다 .

 $file --mime-encoding Documents/poster2.pdf 
Documents/poster2.pdf: binary
 $file --mime-encoding projects/linux/history-torvalds/Makefile 
projects/linux/history-torvalds/Makefile: us-ascii
 $file --mime-encoding graphe.tex 
Dgraphe.tex: us-ascii
 $file --mime-encoding software.tex 
software.tex: utf-8

file --mime-encoding | grep binary이를 사용하여 파일이 바이너리인지 감지 할 수 있습니다 . 긴 텍스트 파일에서 유효하지 않은 문자 하나로 혼동될 수 있지만 안정적으로 작동합니다.

예를 들어, cat실수로 바이너리 파일을 열어 터미널이 손상되는 것을 방지하기 위해 다음 셸 스크립트에 별칭을 추가했습니다.

#! /bin/sh -

[ ! -t 1 ] && exec /bin/cat "$@"
for i
do
    if file --mime-encoding -- "$i" | grep -q binary
    then
        hexdump -C -- "$i"
    else
        /bin/cat -- "$i"
    fi
done

관련 정보