Извлечение нескольких файлов .tar.gz с помощью одного вызова tar

Мне было интересно, (и, конечно же, как), можно сказать, что tar извлекает несколько файлов за один проход.

Я – опытный пользователь Unix в течение нескольких лет, и, конечно же, я знаю, что вы можете использовать или find или что-то подобное, чтобы вызвать tar один раз для каждого архива, который вы хотите извлечь, но я не смог создать рабочую командную строку что заставило мой tar извлечь два файла .tar.gz сразу. (И нет, в этом нет ничего плохого, я просто спрашиваю, можно ли обойтись без этого.)

Я задаю этот вопрос скорее из любопытства, может быть,

  • там какая-то странная вилка tar которая поддерживает это
  • кто-то знает, как использовать параметр -M который tar предложил мне, когда я попробовал tar -zxv -f a.tgz -f b.tgz
  • мы все слепы, и это абсолютно легко сделать, но я не мог найти никакого намека в Интернете, который не использовал или не find или xargs или тому подобное.

Пожалуйста, не отвечайте с tar -zxvf *.tar.gz (потому что это не работает) и только ответьте «не работает», если вы абсолютно уверены в этом (и, может быть, есть хорошее объяснение, почему тоже) ,

Редактирование: я был обращен к ответу на этот вопрос в Stack Overflow, который говорит очень подробно, что это невозможно без нарушения текущего синтаксиса tar , но я не думаю, что это правда. Использование tar -zxv -f a.tgz -f b.tgz или tar -zxv --all-args-are-archives *.tar.gz будет нарушать существующий синтаксис, imho.

Это возможно, синтаксис довольно прост:

 $ cat *.tar | tar -xvf - -i 

Параметр -i игнорирует EOF в конце архивов tar, начиная с man-страницы:

 -i, --ignore-zeros ignore blocks of zeros in archive (normally mean EOF) 

для * .tar.gz

 for file in *.tar.gz; do tar -zxf $file; done 

для * .tar.bz2

 for file in *.tar.bz2; do tar -jxf $file; done 

для * .tar.xz

 for file in *.tar.xz; do tar -Jxf $file; done 

Вам нужно использовать цикл. Он не нарушит синтаксис командной строки tar чтобы разрешить несколько опций -f , но для этого потребуется добавить код для последовательного обработки нескольких архивов со всеми видами краевых условий (что происходит, если архив в середине искажен? архивы используют различные механизмы сжатия? Можете ли вы иметь несколько опций -C (вариант GNU tar для извлечения в конкретный каталог) тоже? Что относительно -K (опция GNU tar для запуска с определенным именем участника)? …).

Одна из возможностей избежать цикла for – установить и активировать AVFS , файловую систему FUSE , обеспечивающую прозрачный доступ к архивам. Каждый архив /path/to/archive дублируется как каталог ~/.avfs/path/to/archive# . Если вы хотите сопоставить архивы с подстановочными знаками, существует препятствие для добавления этого символа в соответствие с подстановочным знаком; это можно сделать в zsh.

 mountavfs cp -p ~/.avfs$PWD/{a,b}.tgz\#/* /destination cp -p ~/.avfs/path/to/source/*.tgz(e\''REPLY=$REPLY\#'\')/* /destination