Как сравнить два архива tar (включая содержимое файла, новые / удаленные файлы, символические ссылки)?

У меня два архива tar (сжатые или не сжатые), и я хочу найти все различия в двух архивах. Оба архива содержат полную файловую систему (то есть при распаковке будут генерировать каталоги, такие как /bin , /home , /root , /usr , /var , /etc , … Надеюсь, вы поняли суть). Я хочу иметь следующий список:

  • Новые файлы
  • Удаленные файлы
  • Измененные файлы (содержимое файла, а не только размер)
  • Измененные символические ссылки (как относительные, так и абсолютные)
  • Новые / удаленные символические ссылки

Я не могу просто распаковать эти архивы и использовать diff , поскольку diff не будет правильно распознавать абсолютные символические ссылки (поскольку они указывают на структуру файловой системы архива).

Есть ли другой способ сравнить содержимое двух архивов tar?

Я не думаю, что вы получите что-нибудь полезное от diff если у вас есть символические ссылки для сравнения как таковые. Вместо того, чтобы делать все за один раз, выполните два отдельных прохода: один для сравнения метаданных и один для сравнения содержимого файла.

Если у вас нет экзотических имен файлов, простое сравнение вывода tar -tv или pax -v достаточно для части метаданных. В bash / ksh / zsh:

 pax -v <(archive1.tar) <(archive2.tar) 

Для содержимого архива установите их с помощью avfs и сравните два дерева каталогов.

 mountavfs diff -urN ~/.avfs$PWD/archive1.tar\#/ ~/.avfs$PWD/archive2.tar\#/