猫の混乱でファイルを結合する

猫の混乱でファイルを結合する

次のコマンドを実行すると:

$ 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の例がないことがわかります。^Mcopy2.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次のようなものが散らばっていることがわかります。

                  ss#1

関連情報