tar, извлечь файлы по регулярному выражению

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
lxx
Сообщения: 46
ОС: нет

tar, извлечь файлы по регулярному выражению

Сообщение lxx »

Приветствую! Помогите решить такую проблему...
Есть tar-архив с большим (даже очень) количеством файлов с примерно следующими именами:
dir/a/file1
dir/a/file2
dir/b/file1
dir/c/file1

Нужно извлечь из него только те файлы, чье имя соответствует определенному регулярному выражению, например dir/[^b]/*
Как сие можно реализовать?
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5403
ОС: Gentoo

Re: tar, извлечь файлы по регулярному выражению

Сообщение /dev/random »

Первое пришедшее в голову: tar --interactive обернуть в expect.
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: tar, извлечь файлы по регулярному выражению

Сообщение sash-kan »

проще, конечно, исключить:
tar xf boll.tar --exclude=dir/b/*

но если хочется именно отбора по regexp-у, то напрямую, как я понимаю, не выйдет.
как-нибудь в обход:
tar xf boll.tar $(tar tf boll.tar | grep 'dir/[^b]/')
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5403
ОС: Gentoo

Re: tar, извлечь файлы по регулярному выражению

Сообщение /dev/random »

Код: Выделить всё

#!/usr/bin/expect --

eval "spawn tar -w [lrange $argv 1 1000]"

expect {
    -re "^extract `[lrange $argv 0 0]'\[?\]" { send y\n; exp_continue }
    -re "^.*\[?\]" { send n\n; exp_continue }
    -re "\n" exp_continue
    -re "." exp_continue
}


Принимает те же аргументы, что и tar, плюс самым первым аргументом - регулярное выражение. Запускает tar в интерактивном режиме и сам же ему и отвечает. На запросы о распаковке файла, соответствующего выражению, отвечает 'y', на все остальные запросы - n. Неплохо бы доработать скрипт, чтобы он правильно отвечал на такие запросы, как запрос о перезаписи существующего файла, и т.п. (а не жал на них тупо n)
Спасибо сказали: