
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.jpg
cada 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 ^M
in 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 cat
para juntar arquivos, você precisa evitar todas as opções que modificam a saída: -b
e -n
(linhas numéricas), -E
(marcar os finais de linha com $
), -s
(suprimir linhas vazias repetidas) e -v
e -T
(exibir caracteres não imprimíveis usando imprimíveis personagens).
Responder2
Sua análise parece correta para mim. Eu usaria cat
para juntar arquivos, já que essa é sua função principal. Faça isso sem o -v
switch 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 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
A 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.jpg
arquivo, vim
você verá que ele está repleto deles, por exemplo: