
Если я выполню следующие команды:
$ cat picture.jpg > copy1.jpg
и
$ cat -v picture.jpg > copy2.jpg
copy1.jpg
является точной копией picture.jpg
, но copy2.jpg
намного больше picture.jpg
.
Я предполагаю, что это потому, что copy2.jpg
каждое из того, что cat считала своими окончаниями строк, было заменено на ^M
, и каждое ^M
больше по размеру, чем окончание строки. Это правильно?
Если да cat copy2.jpg
, то я нахожу, что нет ни одного примера ^M
in copy2.jpg
.
Что здесь происходит? И можно ли положиться на cat для идеального объединения файлов с помощью >
, если его вывод может отличаться от ввода?
решение1
Это не просто так ^M
. Каждыйбайт с непечатаемым символом (что бы это ни значило в вашей текущей локали) будет расширен до многобайтового печатного эквивалента в cat -v
.
Если вы используете cat
для объединения файлов, вам нужно избегать всех опций, которые изменяют вывод: -b
и -n
(нумерация строк), -E
(отметка концов строк значком $
), -s
(подавления повторяющихся пустых строк) и -v
и -T
(отображение непечатаемых символов с помощью печатных символов).
решение2
Ваш анализ кажется мне правильным. Я бы использовал cat
для объединения файлов, поскольку это его основная функция. Просто делайте это без коммутатора -v
или каких-либо коммутаторов, если на то пошло.
Использование cat -v ..
файла фактически испортило его. Вы пробовали открыть его в просмотрщике изображений? Я попробовал ваш метод, и это именно то, что произошло с моим.
Доказательства этого вы file
также можете увидеть, используя команду:
$ 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
Информационная страница проливает немного больше света на эту тему:
'-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.
Так где же ^M?
Если вы откроете свой copy2.jpg
файл, скажем, vim
вы увидите, что он завален ими, например: