Команда tar xf, дающая файл, не найдена

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 ).

2
21.06.2021, 10:22
1 ответ

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
7
28.07.2021, 11:23

Теги

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