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