デバッグ目的で特定の文字列を検索するログファイルをサーバーからダウンロードしました。すべての拡張子は.logです。
問題は、1つのファイルにはplain text document (text/plain)
mimeタイプがあり、もう1つのファイルにはBinary (application/octet-stream)
mimeタイプがあることです。
テキストエディターでplain text document (text/plain)
mimeタイプのログファイルをプレーンテキストとして開くことができますが、もう1つはバイナリであるため開けません。
application/octet-stream
MIMEタイプのバイナリ.logファイルを表示するにはどうすればよいですか?
これから answer in grepがファイルをバイナリと見なす理由
ファイル内のどこかにNUL文字がある場合、grepはそれをバイナリファイルと見なします。
この
cat file | tr -d '\000' | yourgrep
のような回避策があり、最初にすべてのヌルを削除してから、ファイルを検索します。
私は最初にテストディレクトリの1つのファイルでそれを試しました:
parto@subroot:~/Desktop/test$ ls
info_pdslpostpaid.log-20160518
parto@subroot:~/Desktop/test$ cat info_pdslpostpaid.log-20160518 | tr -d '\000' > info_pdslpostpaid.log-20160518_edited
parto@subroot:~/Desktop/test$ ls
info_pdslpostpaid.log-20160518 info_pdslpostpaid.log-20160518_edited
parto@subroot:~/Desktop/test$
結果は、plain text document (text/plain)
テキストMIMEファイルです。
次に、複数のファイルを操作しているため、ディレクトリ内の複数のファイルに対して同じコマンドを実行しようとしました。
parto@subroot:~/Desktop/test$ ls
info_pdslpostpaid.log-20160518 info_pdslpostpaid.log-20160520 info_pdslpostpaid.log-20160523 info_pdslpostpaid.log-20160525
parto@subroot:~/Desktop/test$ for i in * ; do cat "$i" | tr -d '\000' > "${i}_edited" ; done
parto@subroot:~/Desktop/test$ ls
info_pdslpostpaid.log-20160518 info_pdslpostpaid.log-20160520_edited info_pdslpostpaid.log-20160525
info_pdslpostpaid.log-20160518_edited info_pdslpostpaid.log-20160523 info_pdslpostpaid.log-20160525_edited
info_pdslpostpaid.log-20160520 info_pdslpostpaid.log-20160523_edited
parto@subroot:~/Desktop/test$
そしてすごい、すべてのログファイルが読み取り可能な形式になりました!! :)
あなた自身の答えに基づいて、ファイルのMIMEタイプを変更するのではなく、grep
を使用してファイルを検索することを具体的に参照しているようです- What XY問題? 。
grep
が単にnullバイトに基づいてファイルを誤認している場合は、-a
または--binary-files=text
オプションを使用して、マニュアルページで説明されているように、grepに関係なくテキストとして扱うように指示できます。
-a, --text
Process a binary file as if it were text; this is equivalent to
the --binary-files=text option.
--binary-files=TYPE
If the first few bytes of a file indicate that the file contains
binary data, assume that the file is of type TYPE. By default,
TYPE is binary, and grep normally outputs either a one-line
message saying that a binary file matches, or no message if
there is no match. If TYPE is without-match, grep assumes that
a binary file does not match; this is equivalent to the -I
option. If TYPE is text, grep processes a binary file as if it
were text; this is equivalent to the -a option. Warning: grep
--binary-files=text might output binary garbage, which can have
nasty side effects if the output is a terminal and if the
terminal driver interprets some of it as commands.