Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: tar: разархивировать несколько файлов по шаблону  (Прочитано 5276 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн AGluk

  • Автор темы
  • Новичок
  • *
  • Сообщений: 18
    • Просмотр профиля
Здравствуйте. Вопрос следующий. В каталоге лежит много файлов .tar.bz2. Можно ли как-то разархивировать их все в текущую папку одной командой. Команда типа

tar -xvjf *.tar.bz2

не проходит. Выдает ошибки вида:


tar: имя второго файла в списке.tar.bz2: Не найден в архиве
tar: имя третьего файла в списке.tar.bz2: Не найден в архиве
...


т.е. для всех файлов кроме первого. Спасибо.

Оффлайн awesome nick

  • Любитель
  • *
  • Сообщений: 59
    • Просмотр профиля
for i in *.tar.bz2; do tar -xvjf $i; doneУ меня получилось  ;)
Моя приходить учиться делать Ubuntu, не бить моя ногами!
AMD Athlon 64 X2 Dual Core 3600+ | 1024 Mb | Asus Radeon HD 3850

Оффлайн AGluk

  • Автор темы
  • Новичок
  • *
  • Сообщений: 18
    • Просмотр профиля
Ух ты :) про цикл я как-то не подумал, спасибо большое. Интересно, а более простого варианта получается нет. Он по маске все файлы подставляет как параметры, вот tar и работает неправильно. А надо по одной подставлять и выполнять каждый раз команду. Ваш цикл это и делает, но все равно как-то с бубном немного получается :) хотя возможно это единственный вариант, спасибо еще раз. Если есть более очевидные варианты, пишите.

Оффлайн ploop

  • Активист
  • *
  • Сообщений: 762
    • Просмотр профиля
По идее, должен регулярные выражения понимать. Хотя я не уверен.
« Последнее редактирование: 27 Ноября 2009, 14:02:29 от ploop »

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Должен, только что-то надо брать в кавычки (двойные).

Оффлайн AGluk

  • Автор темы
  • Новичок
  • *
  • Сообщений: 18
    • Просмотр профиля
Чего-то  я не нашел для tar использование регулярных выражений...

Оффлайн ploop

  • Активист
  • *
  • Сообщений: 762
    • Просмотр профиля
Так по идее их баш распарсить должен, а потом передать тару в качестве параметра...
Или нет?

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
 --transform expr
              applies filename transformations.  The argument to this option can be a
              list  of  replace  expressions,  separated  by semicolon (as in ‘sed’).
              Filename transformations are applied to symbolic  link  targets  during
              both  creation and extraction.  This option may be specified any number
              of times, the specified transofrmations will be applied in turn.
Выдержка из мана по тару.

Оффлайн AGluk

  • Автор темы
  • Новичок
  • *
  • Сообщений: 18
    • Просмотр профиля
bash шаблон заменяет списком, все равно что написать через пробел все имена:

tar -xjvf файл1.tar.bz2 файл2.tar.bz2 ...

А необходимо с каждым именем выполнять команду, а не со всем список:

tar -xjvf файл1.tar.bz2
tar -xjvf файл2.tar.bz2
...

видите разницу... вот в этом и загвоздка. bash делает по первому варианту, а не по второму.

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Т.е. надо tar кормить по ложке.
Тогда, что-то типа
ls "*.tar.bz2" | xargs tar -xjvf
попробуйте.

Оффлайн AGluk

  • Автор темы
  • Новичок
  • *
  • Сообщений: 18
    • Просмотр профиля
К сожалению такой вариант получает точно такую же команду вида:

tar -xjvf файл1.tar.bz2 файл2.tar.bz2 ...

т.к. xargs просто подставляет результат со стандартного входа в качестве аргумента.
И, по-моему, Ваша команда должна быть несколько иной, та что у Вас у меня не проходит:

ls | grep -E '*.tar.bz2' | xargs tar -xjvf

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
А так
find ./ -name "*\.tar.bz2" 2>/dev/null | xargs tar -xjvf

Оффлайн cmp

  • Новичок
  • *
  • Сообщений: 46
    • Просмотр профиля
Если задача сводится к тому чтобы найти файлы, то почему не воспользоваться командой find, которая для того и предназначена.
find -name \*.tar.bz2 -exec tar jxf '{}' \;

ps похоже меня опередили, только что за xargs и зачем он нужен..
« Последнее редактирование: 27 Ноября 2009, 16:10:15 от cmp »

Оффлайн Zaher72

  • Новичок
  • *
  • Сообщений: 1
    • Просмотр профиля
Чтобы новую тему не открывать, может подскажет кто, что в аналогичной ситуации делать с множеством rar архивов, как их все в одну папку скинуть? "Распаковать сюда" создает для каждого архива отдельную папку - крайне неудобственно.

 

Страница сгенерирована за 0.061 секунд. Запросов: 19.