Если я использую cat pic1.png >> pic2.png
есть ли способ добраться pic1.png
из этого pic2.png
?
Я знаю, что это работает, если я просто использую некоторый архивный файл и просто разархивировал его, но я хочу знать, это возможный другой путь.
Один путь состоит в том, чтобы посмотреть на формат файла PNG
https://en.wikipedia.org/wiki/Portable_Network_Graphics#File_header
, формат файла PNG имеет заголовок и серию блоков, которые определяют способ, которым создается файл PNG. Если Вы объединяете в цепочку через блоки, необходимо быть в состоянии извлечь файлы PNG. Вы могли бы стать удачливыми и просто использовать первые 8 байтов файла PNG как идентификатор для нахождения разделительной точки.
С cat file_b >> file_a
Вы просто добавляете содержание file_b
кому: file_a
. Никакое изменение формата, никакое другое управление (1) (2).
Можно возвратиться, просто удалив последние байты файлов; вероятно, что-то как
head --bytes=-$(wc --bytes file_b | cut -d" " -f1) file_a > old_file_a
должен работать.
Объяснение:
wc --bytes file_b
возвращает длину file_b
в байтах (и название файлов, как"5678 file_b
")
wc --bytes file_b | cut -d" " -f1
избавляется от имени файла в выводе wc
путем хранения просто первого поля ("5678
"). Затем мы используем замену процесса для помещения того числа как аргумента head
:
head --bytes=-5678 file_a
выводы все содержание file_a
но последние 5 678 байтов.
Сноски:
(1) В примере OP я сомневаюсь что pic2.png
файл является все еще допустимым файлом PNG...
(2) Включенный в "другое управление" то, что нет никакой записи исходной длины файла или любого маркера, которые разделяют эти два файла. Если после cat
Вы удаляете file_b
у Вас нет способа разделить их снова, не зная длину исходных файлов. archiver формат (tar, zip, rar) делает точно эту бухгалтерию для Вас (и сжатие и контрольная сумма и другая вещь, когда-то).