Unir archivos con confusión de gatos

Unir archivos con confusión de gatos

Si hago los siguientes comandos:

$ cat picture.jpg > copy1.jpg

y

$ cat -v picture.jpg > copy2.jpg

copy1.jpgEs una copia perfecta de picture.jpg, pero copy2.jpges mucho más grande que picture.jpg.

Supongo que esto se debe a que copy2.jpgcat pensó que cada uno de los finales de línea se reemplazó por a ^M, y cada uno ^Mes más grande que un final de línea. ¿Es esto correcto?

Si lo hago cat copy2.jpg, encuentro que no hay instancias de ^Min 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 catpara unir archivos, debe evitar todas las opciones que modifiquen la salida: -by -n(líneas numéricas), -E(marcar los finales de línea con $), -s(suprimir líneas vacías repetidas) y -vy -T(mostrar caracteres no imprimibles usando archivos imprimibles). caracteres).

Respuesta2

Tu análisis me parece correcto. Lo usaría catpara unir archivos, ya que esa es su función principal. Simplemente hágalo sin el -vinterruptor, 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 filecomando:

$ file copy*
copy1.png: PNG image data, 1440 x 847, 8-bit/color RGB, non-interlaced
copy2.png: ASCII text, with very long lines

catLa 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.jpgarchivo, vimverá que está lleno de ellos, por ejemplo:

                  SS#1

información relacionada