Juntando arquivos com confusão de gato

Juntando arquivos com confusão de gato

Se eu fizer os seguintes comandos:

$ cat picture.jpg > copy1.jpg

e

$ cat -v picture.jpg > copy2.jpg

copy1.jpgé uma cópia perfeita de picture.jpg, mas copy2.jpgé muito maior que picture.jpg.

Presumo que isso seja porque copy2.jpgcada um dos cat pensava que eram seus finais de linha substituídos por a ^M, e cada um ^Mé maior em tamanho do que um final de linha. Isso está correto?

Se isso acontecer cat copy2.jpg, descubro que não há instâncias de ^Min copy2.jpg.

O que está acontecendo aqui? E pode-se confiar em cat para unir arquivos perfeitamente usando >, se sua saída puder ser diferente de sua entrada?

Responder1

Não é apenas ^M. Todobyte com um caractere não imprimível (o que quer que isso signifique em sua localidade atual) será expandido para um equivalente imprimível de múltiplos bytes em cat -v.

Se estiver usando catpara juntar arquivos, você precisa evitar todas as opções que modificam a saída: -be -n(linhas numéricas), -E(marcar os finais de linha com $), -s(suprimir linhas vazias repetidas) e -ve -T(exibir caracteres não imprimíveis usando imprimíveis personagens).

Responder2

Sua análise parece correta para mim. Eu usaria catpara juntar arquivos, já que essa é sua função principal. Faça isso sem o -vswitch ou qualquer switch.

Usar cat -v ..no arquivo basicamente o destruiu. Você tentou abri-lo em um visualizador de imagens? Eu tentei o seu método e foi exatamente isso que aconteceu com o meu.

Você também pode ver a evidência disso usando o 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

catA página de informações de lança um pouco mais de luz sobre o assunto:

'-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.

Então, onde estão os ^M?

Se você abrir seu copy2.jpgarquivo, vimvocê verá que ele está repleto deles, por exemplo:

                  ss#1

informação relacionada