Мне было интересно, можно ли (и, конечно, как) сказать, tar
извлекать несколько файлов за один прогон.
Я опытный пользователь Unix в течение нескольких лет и, конечно, я знаю, что вы можете использовать for
или find
или что-то подобное, чтобы вызывать tar
один раз для каждого архива, который вы хотите извлечь, но я не смог придумать рабочую командную строку, которая вызывала мой tar
извлечь два файла .tar.gz одновременно. (И нет, в этом нет ничего плохого for
, я просто спрашиваю, можно ли обойтись без него.)
Я задаю этот вопрос скорее из любопытства, может быть
- есть странная развилка
tar
где-то, которая поддерживает это - кто-то знает, как использовать
-M
параметр, которыйtar
предложил мне, когда я пыталсяtar -zxv -f a.tgz -f b.tgz
- мы все слепы, и это совершенно легко сделать - но я не смог найти в Интернете ни одного намека, который бы не использовал
for
илиfind
илиxargs
и тому подобное.
Пожалуйста, не отвечайте с tar -zxvf *.tar.gz
(потому что это не работает), и отвечайте только «не работает», если вы абсолютно уверены в этом (и, возможно, у вас есть хорошее объяснение, почему тоже).
Изменить: мне было указано на ответ на этот вопрос о переполнении стека, который очень подробно говорит, что это невозможно без нарушения текущего tar
синтаксиса, но я не думаю, что это правда. Использование tar -zxv -f a.tgz -f b.tgz
или tar -zxv --all-args-are-archives *.tar.gz
не нарушит существующий синтаксис, imho.
-M
параметром.Ответы:
Это возможно, синтаксис довольно прост:
Опция -i игнорирует EOF в конце архивов tar со страницы man:
источник
cat *.tar.bz2 | tar -ixjv
. Благодарность!для * .tar.gz
для * .tar.bz2
для * .tar.xz
источник
$file
если ваши файлы имеют имена с пробелами.Вам нужно использовать цикл. Это не нарушило бы
tar
синтаксис командной строки, чтобы разрешить несколько-f
опций, но потребовало бы добавления кода для последовательной обработки нескольких архивов со всеми видами граничных условий (Что произойдет, если архив в середине искажен? Могут ли архивы использовать разные механизмы сжатия? У вас может быть несколько-C
опций (опция tar GNU для извлечения в конкретный каталог)? Как насчет -K (опция tar GNU, начинающаяся с определенного имени члена)?…).Одна возможность избежать
for
цикла - это установить и активировать AVFS , файловую систему FUSE, которая обеспечивает прозрачный доступ к архивам. Каждый архив/path/to/archive
дублируется как каталог~/.avfs/path/to/archive#
. Если вы хотите сопоставить архивы с подстановочными знаками, есть препятствие добавить это#
к сопоставлению с подстановочными знаками; это можно сделать в зш.источник
find . -name "*.tar.gz" -exec tar xzf {} \;
источник