
次のコマンドを実行すると:
$ cat picture.jpg > copy1.jpg
そして
$ cat -v picture.jpg > copy2.jpg
copy1.jpg
は の完全なコピーですpicture.jpg
が、copy2.jpg
よりもはるかに大きいですpicture.jpg
。
copy2.jpg
これは、cat が行末だと思っていた が に置き換えられ^M
、それぞれが^M
行末よりも大きいためだと思います。これで正しいでしょうか?
の場合、にはcat copy2.jpg
の例がないことがわかります。^M
copy2.jpg
>
ここで何が起こっているのでしょうか? また、出力が入力と異なる場合、cat は を使ってファイルを完全に結合できるのでしょうか?
答え1
それはただではありません^M
。 毎印刷できない文字 (現在のロケールで何を意味するかは関係ありません) を含むバイトは、 の下では複数バイトの印刷可能な文字に展開されますcat -v
。
を使用してファイルを結合する場合はcat
、出力を変更するすべてのオプションを避ける必要があります:-b
および-n
(行に番号を付ける)、-E
(行末を でマークする$
)、-s
(空行の繰り返しを抑制する)、および-v
(-T
印刷不可能な文字を印刷可能な文字を使用して表示する)。
答え2
あなたの分析は正しいように思えます。ファイルの結合が主な機能なので、私はこれを使います。スイッチやスイッチをcat
使わずに実行してください。-v
cat -v ..
ファイルを を使用すると、実質的にファイルが破損します。画像ビューアで開いてみましたか? あなたの方法を試しましたが、私の場合もまったく同じことが起こりました。
次のコマンドを使用して、この証拠を確認することfile
もできます。
$ file copy*
copy1.png: PNG image data, 1440 x 847, 8-bit/color RGB, non-interlaced
copy2.png: ASCII text, with very long lines
cat
の情報ページでは、この件についてもう少し詳しく説明しています。
'-v'
'--show-nonprinting'
Display control characters except for LFD and TAB using '^'
notation and precede characters that have the high bit set with
'M-'.
On systems like MS-DOS that distinguish between text and binary
files, 'cat' normally reads and writes in binary mode. However, 'cat'
reads in text mode if one of the options '-bensAE' is used or if 'cat'
is reading from standard input and standard input is a terminal.
Similarly, 'cat' writes in text mode if one of the options '-bensAE' is
used or if standard output is a terminal.
それで、^M はどこにあるのでしょうか?
copy2.jpg
ファイルを say で開くと、vim
次のようなものが散らばっていることがわかります。