perl -F\\. -lane '
$h{@ARGV}{$F[0]}++,next if @ARGV;
print if exists $h{2}{$_} && !exists $h{1}{$_};
' up.txt dw.txt a.txt
Создайте хеш %h с ключами верхнего уровня как "2" и "1", где 2 относится к первому аргументу (up.txt ), 1 относится к dw.txt. Для приведенных данных хэш-структура будет выглядеть примерно так :(порядок может отличаться)
%h = (
1 => { a => 1, b => 1, },
2 => { a => 1, b => 1, c => 1, },
);
как видно, внутри основного хеша %h есть два мини-хэша -. Поэтому, когда приходит время читать третий аргумент (a.txt ), мы принимаем решение распечатать запись, основываясь на том, можно ли увидеть эту запись (как ключ )в мини -хэш %2 И не отображается в мини-хэше -%1, внутри основного хэша %h (, также называемом хэшем -из -хэшей, или HoH ).
rootfs.tar
представляет собой tar-архив, сжатый с помощью gzip. rootfs.tar.gz
представляет собой tar-архив, дважды сжатый с помощью gzip. Tar, кажется, сбит с толку двойным сжатием и рассматривает файл как пустой архив вместо того, чтобы сообщать об ошибке.
Двойное сжатие бессмысленно, поэтому удалите этот дополнительный шаг gzip. Во избежание путаницы вызывайте сжатый архив rootfs.tar.gz
вместо rootfs.tar
. И поскольку путь, который вы переходите к tar
, начинается с .
, вам нужно пройти путь, начинающийся с ./
, при извлечении :tar не рассматривает ./
как операцию -без пути в путях..
mkdir test
touch test/version.txt
echo "1.0.2" > test/version.txt
tar zcvf rootfs.tar.gz -C test.
tar xf rootfs.tar.gz./version.txt
Если вы хотите избежать префикса ./
в именах файлов, вы можете использовать --transform
при создании архива.
tar zcvf rootfs.tar.gz --transform='s!^\./!!' -C test.
tar xf rootfs.tar.gz version.txt