GNU/Linux >> Linux の 問題 >  >> Linux

LsとHexdumpがファイルサイズについて意見が一致しないのはなぜですか?

テスト目的(SSHクライアントでUTF-8出力をテストする)のために(vimで)作成したファイルがあります。ただし、このファイルには奇妙なことが起こっています。

ファイルに何バイトあるのか疑問に思ったので、hexdumpを使用しました :

[email protected]:~$ hexdump -x intl.txt
0000000    9ecf    000a
0000003

わかりました。そこには4バイトあります。00と0aがどのようにそこに入ったのか、はっきりしていませんが、何でもです。ただし、ここで奇妙になります:

[email protected]:~$ ls -al intl.txt
-rw-rw-r-- 1 username username 3 Mar 26 15:14 intl.txt

待って、それは3バイトですか?ここで何が起こっているのですか?

それが十分に奇妙ではなかったかのように、hexdump -C 非常に異なる出力を提供します:

[email protected]:~$ hexdump -C intl.txt
00000000  cf 9e 0a                                          |...|
00000003

Vimもファイルについて少し混乱しています。起動すると、ステータス行に次のように表示されます:

"intl.txt" 1L, 3C

しかし、私はこれを取得します(set listを使用) ):

Ϟ$
~
~
~
~

つまり、3文字あると思いますが、印刷するのは1文字だけです。コッパとその下の空白行が印刷されているかどうかわかりました…

承認された回答:

他の人が指摘しているように、これはhexdump -xが原因です ファイルを2バイトの単語を含むものとして扱います。リトルエンディアンシステム(ほとんどすべてのデスクトップがそうである)では、これは、バイトが表示される前にスワップされることを意味します。これは、バイト値がペアで出力され、これらのバイトの順序が入れ替わることを意味します。バイト数が奇数なので、hexdump 最後のペアを構成するためにゼロを追加するだけです。次に、ゼロは0aと交換されます 。これは、hexdumpの動作を文書化したものです。 、だからそれはあなたに嘘をついていません!

hexdump -Cを使用する ファイル内の順序でバイトを表示するフォーマットされた出力を取得するためのより良いコマンドです。また、0a は新しい行であり、おそらくファイルを作成したものによって静かに追加されました(vim これはデフォルトで行われます)。例:echo そうしないように指示しない場合は、常に新しい行が追加されます。 bashで :

echo -e '\xcf\x9e' | hexdump -C

同じ結果が得られますが、-nで改行を抑制します あなたが期待したものを与えるでしょう:

echo -ne '\xcf\x9e' | hexdump -C

vimを停止するには 改行の追加から:

:set noeol
:set binary

Linux
  1. Bashスクリプトがエイリアスを認識しないのはなぜですか?

  2. 次の方法でコアファイルの制限サイズが変更されないのはなぜですか?

  3. .exrcと.vimrcの違いは?

  1. Ls -lがすべてのファイルの時間や年を表示しないのはなぜですか?

  2. イオリダイレクションとヘッドコマンド?

  3. パーティションのセクターサイズを見つけますか?

  1. ファイル記述子が開かれ、一度だけ読み取られるのはなぜですか?

  2. 特定のファイルを含むファイルシステムのサイズと空き容量を見つける

  3. キャッシュ ラインに合わせてキャッシュ ラインのサイズを知る