Список всех файлов, присутствующих в backup2.tar.bz2, но отсутствующих в backup1.tar.bz2

Не пытайтесь отслеживать, какие переменные и функции вы создаете. Вместо этого запустите код в подоболочке. Когда подоболочка завершается, все переменные и функции, определенные в подоболочке, исчезают.

В bash одним из способов явного помещения команд в подоболочку является размещение команд внутри скобок:(...). Например, давайте определим две переменные и функцию внутри подоболочки и выполним функцию:

$ ( a=1; b=2; fn() { echo "a=$a b=$b"; }; fn )
a=1 b=2

После завершения подоболочки все стирается:

$ fn
bash: fn: command not found
1
01.11.2019, 09:35
2 ответа

Если у вас есть AWK, вы можете использовать один лайнер, подобный этому:

awk '{if (NR==FNR) { arr[$6]=1 } else { if (! arr[$6]) { print } } }' backup2_files.txt backup1_files.txt

Это создаст массив AWK с именами файлов из резервной копии 2, а затем проверит, присутствуют ли в этом массиве имена файлов из резервной копии 1. Если нет, он их напечатает.

РЕДАКТИРОВАТЬ :Вот улучшенная версия, которая более устойчива к файлам с пробелами в имени и не требует временных файлов:

 awk '{ key=""; for (i = 6; i <= NF; i++) { key=col_cat $i }; if (NR == FNR) { arr[key]=1 } else { if (! arr[key]) { print } } }' <(tar tvf backup2.tar.bz2 |sort -k3 -n) <(tar tvf backup1.tar.bz2 |sort -k3 -n)

Вы можете записать awk-код в файл, например intersect.awk, и повторно -использовать его, как:

awk -f intersect.awk <(tar tvf backup2.tar.bz2 |sort -k3 -n) <(tar tvf backup1.tar.bz2 |sort -k3 -n)
0
27.01.2020, 23:57

Предлагаемые методы из других ответов не работают, так как tar будет печатать:

name123 symbolic link to namexyz

если в архиве есть симлинки и аналогичные сообщения для хардлинков.

Таким образом, единственный способ справиться с этим — использоватьstar:

star -t -tpath < archive.tar.bz2 > somename

Сделайте это для всех архивов, отсортируйте выходные данные, а затем используйте известные методы для сравнения полученных файлов.

Опция -tpathуказывает starпечатать имя файла только один раз в строке.

starявляется частью schilytools.

Кстати, :Если имя файла содержит символ новой строки, этот метод запутает инструменты сравнения.

0
27.01.2020, 23:57

Теги

Похожие вопросы