
Si hago los siguientes comandos:
$ cat picture.jpg > copy1.jpg
y
$ cat -v picture.jpg > copy2.jpg
copy1.jpg
Es una copia perfecta de picture.jpg
, pero copy2.jpg
es mucho más grande que picture.jpg
.
Supongo que esto se debe a que copy2.jpg
cat pensó que cada uno de los finales de línea se reemplazó por a ^M
, y cada uno ^M
es más grande que un final de línea. ¿Es esto correcto?
Si lo hago cat copy2.jpg
, encuentro que no hay instancias de ^M
in copy2.jpg
.
¿Que está pasando aqui? ¿Y se puede confiar en cat para unir archivos perfectamente usando >
, si su salida puede ser diferente de su entrada?
Respuesta1
No es sólo ^M
. Cadaun byte con un carácter no imprimible (lo que sea que eso signifique en su configuración regional actual) se expandirá a un equivalente imprimible de múltiples bytes en cat -v
.
Si está utilizando cat
para unir archivos, debe evitar todas las opciones que modifiquen la salida: -b
y -n
(líneas numéricas), -E
(marcar los finales de línea con $
), -s
(suprimir líneas vacías repetidas) y -v
y -T
(mostrar caracteres no imprimibles usando archivos imprimibles). caracteres).
Respuesta2
Tu análisis me parece correcto. Lo usaría cat
para unir archivos, ya que esa es su función principal. Simplemente hágalo sin el -v
interruptor, ni ningún interruptor.
El uso cat -v ..
del archivo esencialmente lo ha destruido. ¿Intentaste abrirlo en un visor de imágenes? Probé tu método y eso es exactamente lo que le pasó al mío.
También puedes ver la evidencia de esto usando el file
comando:
$ 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
La página de información arroja un poco más de luz sobre el tema:
'-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.
Entonces, ¿dónde están las ^M?
Si abre su copy2.jpg
archivo, vim
verá que está lleno de ellos, por ejemplo: