
Wenn ich die folgenden Befehle ausführe:
$ cat picture.jpg > copy1.jpg
Und
$ cat -v picture.jpg > copy2.jpg
copy1.jpg
ist eine perfekte Kopie von picture.jpg
, aber copy2.jpg
viel größer als picture.jpg
.
Ich nehme an, das liegt daran, dass copy2.jpg
jedes von dem, was cat für sein Zeilenende hielt, durch ein ersetzt wurde ^M
und jedes ^M
größer ist als ein Zeilenende. Ist das richtig?
Wenn Sie das dann tun , stelle ich fest, dass es in cat copy2.jpg
keine Instanzen von gibt .^M
copy2.jpg
Was ist hier los? Und kann man sich darauf verlassen, dass cat Dateien perfekt mit verbindet >
, wenn die Ausgabe von der Eingabe abweichen kann?
Antwort1
Es ist nicht nur ^M
. JedenByte mit einem nicht druckbaren Zeichen (was auch immer das in Ihrer aktuellen Sprache bedeutet) wird unter in ein druckbares Äquivalent mit mehreren Bytes erweitert cat -v
.
Wenn Sie zum Verbinden von Dateien verwenden cat
, müssen Sie alle Optionen vermeiden, die die Ausgabe verändern: -b
und -n
(Zeilen nummerieren), -E
(Zeilenenden mit markieren $
), -s
(wiederholte leere Zeilen unterdrücken) und -v
und -T
(nicht druckbare Zeichen mit druckbaren Zeichen anzeigen).
Antwort2
Ihre Analyse klingt für mich richtig. Ich würde es cat
zum Zusammenfügen von Dateien verwenden, da dies seine Hauptfunktion ist. Tun Sie es einfach ohne den -v
Schalter oder überhaupt ohne Schalter.
Die Verwendung cat -v ..
der Datei hat sie im Wesentlichen zerstört. Haben Sie versucht, sie in einem Bildbetrachter zu öffnen? Ich habe Ihre Methode ausprobiert und genau das ist bei mir passiert.
Den Beweis hierfür können Sie file
auch mit dem folgenden Befehl sehen:
$ 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
Die Infoseite von wirft etwas mehr Licht auf das Thema:
'-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.
Also, wo sind die ^M's?
Wenn Sie Ihre copy2.jpg
Datei beispielsweise öffnen vim
, werden Sie feststellen, dass sie voll davon ist. Zum Beispiel: