파일은 다양한 운영 체제에서 다양한 Mime 유형을 제공합니다.

파일은 다양한 운영 체제에서 다양한 Mime 유형을 제공합니다.

그래서 다음을 부분적으로 수행하는 bash 스크립트가 있습니다.

file -b --mime-type "$1"

그런 다음 예상되는 파일 형식인지 확인하는 논리가 있습니다.

if [[ $type == "application/gzip" ]]; then
    <stuff>
    exit 0
fi

# basically the else
echo "File type $type not supported"

그래서 저는 데비안 시스템에서 이 스크립트를 만들었고 모든 로직이 잘 작동했습니다. 그러나 동료가 자신이 작업 중인 일부 시스템(CentOS 기반)에서 이를 사용할 수 있는지 물었을 때 그는 계속 다음과 같은 오류 출력을 받았습니다.

File type application/x-gzip not supported

스크립트예전에는이식성을 목표로 하므로 bash나 파일 등을 사용하세요. CentOS 시스템에서 보려고 했는데 /usr/share/magic일반 텍스트인 것 같습니다. 그러나 데비안에서는 바이너리 형식이므로 상호작용하기가 더 어렵습니다.

그래서 제가 이해한 바에 따르면 를 호출하면 ---mime-type모든 운영 체제에서 매번 동일한 MIME 유형이 표시됩니다. if 문에 추가할 수 있다는 것을 알고 있지만 application/x-gzip출력을 일관되게 만드는 방법이 있다면 이를 옵션으로 남겨 두겠습니다. 또한 나중에 이 스크립트에 다른 부분을 추가하거나 향후 작업을 위한 템플릿으로 사용하는 경우 운영 체제 전반에 걸쳐 일관된 출력을 얻을 수 있는 방법이 있어서 많은 가장자리에 대해 걱정할 필요가 없습니다. 사례.

일관된 답변을 얻을 수 있는 방법이 있다면 파일이 아닌 다른 것으로 변경할 수도 있습니다.

미리 감사드립니다.

편집 #00

원래 IANA를 참조로 사용했지만 IANA가 인식하지 못하는 유형이 많다는 것을 깨달았습니다. 물론 이것은 상황을 더욱 악화시킵니다.

버전 차이에 대한 귀하의 제안에 따르면 데비안 시스템은 다음과 같기 때문에 이것이 근본 원인일 수 있다고 생각합니다.

redacted@redacted ~$ file -v
file-5.35
magic file from /etc/magic:/usr/share/misc/magic

CentOS 시스템은 다음 위치에 있습니다.

redacted@redacted ~$ file -v
file-5.11
magic file from /etc/magic:/usr/share/misc/magic

strace 테스트의 경우 위 두 환경의 백업도 포함하여 /etc/magic의 파일을 읽고 있음을 보여주며 CentOS의 경우 파일은 일반 텍스트입니다. strace는 다음과 같습니다:

strace -e trace=stat,open,openat file -i bob.txt
open("/usr/lib64/tls/x86_64/libmagic.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/usr/lib64/tls/x86_64", 0x7fff0427d1d0) = -1 ENOENT (No such file or directory)
open("/usr/lib64/tls/libmagic.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/usr/lib64/tls", {st_mode=S_IFDIR|0555, st_size=4096, ...}) = 0
open("/usr/lib64/x86_64/libmagic.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/usr/lib64/x86_64", 0x7fff0427d1d0) = -1 ENOENT (No such file or directory)
open("/usr/lib64/libmagic.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib64/tls/libz.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib64/libz.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib64/tls/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
stat("/root/.magic.mgc", 0x7fff0427e750) = -1 ENOENT (No such file or directory)
stat("/root/.magic", 0x7fff0427e750)    = -1 ENOENT (No such file or directory)
stat("/etc/sysconfig/64bit_strstr_via_64bit_strstr_sse2_unaligned", 0x7fff0427dcb0) = -1 ENOENT (No such file or directory)
open("/etc/magic.mgc", O_RDONLY)        = -1 ENOENT (No such file or directory)
stat("/etc/magic", {st_mode=S_IFREG|0644, st_size=111, ...}) = 0
open("/etc/magic", O_RDONLY)            = 3
open("/usr/share/misc/magic.mgc", O_RDONLY) = 3
open("/usr/lib64/gconv/gconv-modules.cache", O_RDONLY) = 3
stat("bob.txt", {st_mode=S_IFREG|0644, st_size=19, ...}) = 0
open("bob.txt", O_RDONLY)               = 3
bob.txt: text/troff; charset=us-ascii
+++ exited with 0 +++

troff와 .txt가 일치하지 않는다는 점은 신경쓰지 마세요. 이는 의도적인 것입니다. TROFF가 선택된 이유는 단순한 일반 텍스트 그 이상이기 때문입니다...

동료 중 한 명이 CentOS 시스템에서 파일 버전을 업데이트할 수 있는지 확인하고 결과가 더 나은지 확인하겠습니다.

편집 #01

그래서 다른 도구인 xdg-mime을 조사하는 동안 나는 그 프로그램 내에서 (적어도) x-gzip과 gzip 사이에 기능적 차이가 없는 것 같다는 것을 발견했습니다.

xdg-mime 유형의 소스 코드, ll. 2427-35

프로그램 내에서 별칭으로 간주되는 것 같습니다(이 문제를 해결하기 위해 프로그램에 별도의 매직 스토어가 있는지 조사 중입니다). 따라서 두 변종 모두 매직 파일에 존재하는 것이 일반적인 것 같습니다.

답변1

application/gzip2012년 IANA 에 의해 정의되었습니다.

그러나 HTTP의 경우 다음과 같은 주석이 있습니다.

[...] 또는 이전 HTTP 구현과의 호환성을 위해 애플리케이션은 "x-gzip" 및 "x-compress"를 각각 "gzip" 및 "compress"와 동일하게 처리해야 합니다.

그러나 이것은 꽤 (매우) 오래된 HTTP/1.1에 대한 것이며 사람들이 이를 사용하는 용도에 따라 완전히 다른 게임입니다.

x-gzip 자체는 누군가가 등록되지 않은 하위 유형에 사용될 수 있다고 말한 1990년대 초의 제품입니다 .

일반적으로 말하면 둘 다 사용되어 왔으며 사용되고 있습니다. 할 수 있다면선택하다나는 비 x-변형을 사용하겠습니다. 하지만 100%일관성왜냐하면 그런 일은 짐승의 본성상 매우 어려울 것이기 때문이다. 시대가 변하는 것처럼 file동일한 기능을 가진 다른 도구도 변할 것입니다.

기준 등에 대해서는RFC 6838(2013년 1월) 강하게유형의 사용은 권장되지 않습니다 x-.


누구든지 좀 봐주면file주문하다자체는 x-gzip다음으로 대체됩니다.gzip 2019(외관으로 판단).

BGZF(차단된 gzip)가 있습니다.x-gzip 사용게다가. 그건"더"위에서 언급한 RFC와 충돌하기는 하지만 gzip의 변형이므로 이해할 수 있습니다. 하지만 이런 것들을 제자리에 두는 데는 오랜 시간이 걸립니다. 얼마나 많은 응용 프로그램 등에서 사용되는지 누가 알겠습니까?


일관성을 보장하는 유일한 방법은 동일한 데이터베이스가 시스템 전체에서 사용되도록 하는 것입니다.

file사용매직 패턴 파일 그리고할 수 있다강좌분배magic.mgc스크립트를 사용하여 삽입해야 한다고 말 $HOME/.magic하거나 -m스크립트의 옵션을 사용합니다(이/이 매직 파일을 사용하세요). 다른 버전을 사용하면 문제가 발생할 수 있지만 file어떤 버전을 사용해야 할지 확실하지 않습니다.

매직 파일은 텍스트 형식으로 작성된 후 mgc로 컴파일됩니다.

file -C -m my-magic-file

하지만 하나 있어요할 수 있는일반 텍스트로도 사용하세요. 어쩌면 CentOS 시스템에 무슨 일이 일어났을까요? A는 strace무슨 일이 일어났는지 공개해야 합니다.

strace -e trace=stat,open,openat file -i foo.ext

이것이 매우 일관성이 없고 여기저기서 나타나고 있다면 죄송합니다.

답변2

이부프로펜은 이미 매직 파일의 작동 방식을 훌륭하게 설명했으므로 file실용적인 "어떻게 작동하게 합니까?" 답변을 추가하겠습니다.

=~정확한 일치( ) 대신 두 변형을 모두 일치시키는 정규식 일치 ==( )를 사용합니다.

if [[ $type =~ ^application/(x-)?gzip$ ]]; then
...
fi

또는 (일치하는 것이 마음에 들지 않으면아무것"gzip" 패턴을 포함합니다.가능한당신이 원하거나 기대하는 것보다 더 많은 것 - 예를 들어 /etc/mime.types내 Debian 시스템에는 "application/tlsrpt+gzip"이 나열되어 있는데, 이는 일종의 gzip 압축 SMTP TLS 보고서인 것 같습니다... 본 적이 없지만 IETF 초안이 있습니다. 기준):

if [[ $type =~ gzip ]]; then
...
fi

관련 정보