Объединение файлов с кошачьей путаницей

Объединение файлов с кошачьей путаницей

Если я выполню следующие команды:

$ 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, то я нахожу, что нет ни одного примера ^Min 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вы увидите, что он завален ими, например:

                  сс#1

Связанный контент