
そのため、以下を部分的に実行するbashスクリプトがあります。
file -b --mime-type "$1"
次に、予想されるファイル形式であることを確認するロジックがあります。
if [[ $type == "application/gzip" ]]; then
<stuff>
exit 0
fi
# basically the else
echo "File type $type not supported"
だから私はDebianシステムでこのスクリプトを作成し、すべてのロジックがうまくいきました。しかし、同僚が自分が作業している一部のシステム(CentOSベース)でそれを使用できるかどうか尋ねたとき、彼は次のエラー出力を受け取り続けました。
File type application/x-gzip not supported
スクリプト以前は移植性を目指しますので、bashやファイルなどを使用してください。 CentOSシステムで見ようとしましたが、/usr/share/magic
プレーンテキストのようです。しかし、Debianではバイナリ形式なので、対話するのは難しいです。
だから私が理解したように、 を呼び出すと、---mime-type
すべてのオペレーティングシステムで毎回同じMIMEタイプが表示されます。 ifステートメントに追加できることを知っていますが、application/x-gzip
出力を一貫して作成する方法がある場合は、それをオプションとして残します。また、後でこのスクリプトに別の部分を追加したり、将来の作業のためのテンプレートとして使用したりする場合は、オペレーティングシステム全体で一貫した出力を取得する方法があるため、多くのエッジについて心配する必要はありません。ケース。
一貫した回答を得る方法がある場合は、ファイル以外のものに変更することもできます。
よろしくお願いします。
編集#00
もともとIANAを参考にしていましたが、IANAが認識しないタイプが多いことに気づきました。もちろん、これは状況をさらに悪化させます。
バージョンの違いに対するあなたの提案によれば、Debian システムは次のようになるので、これが根本的な原因である可能性があると思います。
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テストでは、上記の2つの環境のバックアップも含めて/ 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が選択された理由は、単純なプレーンテキスト以上であるためです。
同僚の1人がCentOSシステムでファイルのバージョンを更新できることを確認し、結果が良いかどうかを確認します。
編集#01
それで、他のツールxdg-mimeを調べている間、私はそのプログラム内で(少なくとも)x-gzipとgzipの間に機能的な違いがないようです。
プログラム内でエイリアスと見なされているようです(この問題を解決するために、プログラムに別のマジックストアがあるかどうかを調べています)。したがって、両方のバリアントがマジックファイルに存在するのが一般的なようです。
答え1
application/gzip
2012年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レポートのようなものです...あります。標準):
if [[ $type =~ gzip ]]; then
...
fi