распаковка большого количества файлов на лету - PullRequest
1 голос
/ 06 сентября 2010

У меня есть скрипт, который мне нужно запустить на большом количестве файлов с расширением **. Tar.gz *.

Вместо того, чтобы распаковывать их, а затем запускать сценарий, я хочу иметь возможность распаковывать их, когда я запускаю команду, а затем работаю с несжатой папкой, и все это одной командой.

Я думаю, что труба - хорошее решение для этого, но я не использовал это раньше. Как бы я это сделал?

Ответы [ 3 ]

1 голос
/ 06 сентября 2010

следующие три строки bash ...

for archive in *.tar.gz; do
    tar zxvf "${archive}" 2>&1 | sed -e 's!x \([^/]*\)/.*!\1!' | sort -u | xargs some_script.sh
done

... будет перебирать каждый сжатый архив в текущем каталоге, распаковывать его, захватывать самые верхние каталоги распакованного содержимого и передавать их в качестве аргументов somescript.sh. Это, вероятно, использует больше каналов, чем вы ожидали, но, похоже, делает то, что вы просите.

N.B: tar xf может принять только один файл за вызов.

1 голос
/ 06 сентября 2010

-v приказывает tar печатать имена файлов при извлечении каждого файла:

tar -xzvf file.tar.gz | xargs -I {} -d\\n myscript "{}"

Таким образом, скрипт будет содержать команды для работы с одним файлом, передаваемым в качестве параметра (благодаряxargs) к вашему сценарию ($1 в контексте сценария).

Редактировать: часть -I {} -d\\n будет работать с пробелами в именах файлов.

0 голосов
/ 06 сентября 2010

Вы можете использовать цикл for:

for file in *.tar.gz; do tar -xf "$file"; your commands here; done

Или расширенный:

for file in *.tar.gz; do
    tar -xf "$file"
    # your commands here
done
...