Не пытайтесь отслеживать, какие переменные и функции вы создаете. Вместо этого запустите код в подоболочке. Когда подоболочка завершается, все переменные и функции, определенные в подоболочке, исчезают.
В bash одним из способов явного помещения команд в подоболочку является размещение команд внутри скобок:(...)
. Например, давайте определим две переменные и функцию внутри подоболочки и выполним функцию:
$ ( a=1; b=2; fn() { echo "a=$a b=$b"; }; fn )
a=1 b=2
После завершения подоболочки все стирается:
$ fn
bash: fn: command not found
Если у вас есть 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)
Предлагаемые методы из других ответов не работают, так как tar будет печатать:
name123 symbolic link to namexyz
если в архиве есть симлинки и аналогичные сообщения для хардлинков.
Таким образом, единственный способ справиться с этим — использоватьstar
:
star -t -tpath < archive.tar.bz2 > somename
Сделайте это для всех архивов, отсортируйте выходные данные, а затем используйте известные методы для сравнения полученных файлов.
Опция -tpath
указывает star
печатать имя файла только один раз в строке.
star
является частью schilytools
.
Кстати, :Если имя файла содержит символ новой строки, этот метод запутает инструменты сравнения.