Витягніть декілька файлів .tar.gz за допомогою одного дзвінка


35

Мені було цікаво, чи можна (і, звичайно, як) можна сказати 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(бо це не працює), а відповідь лише "не працює", якщо ви абсолютно впевнені в цьому (і, можливо, маєте хороше пояснення, чому теж).

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


З цікавості, яка ситуація змусила вас почати думати про те, як уникнути циклічної конструкції?
unclejamil

1
FYI: смола GNU підтримує багатотомні таргові архіви з -Mпараметром.
Стів-о

1
unclejamil: Я пишу HowTo, і один із кроків у ньому включає розпакування декількох стислих файлів (.tar.bz2, .tar.gz, .zip). А оскільки це HowTo, мені було цікаво, яким буде найелегантніший командний рядок для цього. :)
scy

Відповіді:


39

Це можливо, синтаксис досить простий:

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

Параметр -i ігнорує EOF в кінці архіву tar, зі сторінки man:

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

1
Це, здавалося, працює для мене. Точна команда , яку я використовував , була: cat *.tar.bz2 | tar -ixjv. Спасибі!
scy

1
<Для tgz> кіт * .tgz | tar -xzvf - -i -C / призначення / <or> для файлу в * .tgz; do tar -xzvf $ file -C / призначення /; виконано
Ферроао

27

для * .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

1
Виправте тут форматування, і це буде читабельніше.
eyoung100

це чудово. формат також чудовий тим, що ось як це виглядає в терміналі
smatthewenglish

1
Не забудьте поставити лапки, $fileякщо у ваших файлах є імена з пробілами.
Олександр Рево

Це насправді не відповідає на питання про те, чи можливо витяг декількох архівів за допомогою одного виклику tar. Крім того, користувач каже, що вони вже знайомі з тим, як використовувати for-loops для ітерації над набором файлів.
Кусалаланда

2

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

Однією з можливостей уникнути 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

-1

find . -name "*.tar.gz" -exec tar xzf {} \;


що це робить?
П’єр.Вріенс

1
Це вводить неявний цикл виклику циклу один раз для кожного знайденого файлу, і користувач каже, що вони вже знають, як це зробити.
Кусалаланда

Вибачте, я не прочитав питання уважно, я просто шукав спосіб вилучення декількох пакетів дьогтю, прочитайте відповідь вище і думаю, що знайти знайти буде простіше.
zjengjie
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.