У меня есть список файлов .tar.gz с той же внутренней структурой папок, и я хочу пакетировать gunzip | распаковать из них один файл в отдельные папки.
logs_2013-08-01.tar.gz
logs_2013-08-02.tar.gz
logs_2013-08-03.tar.gz
logs_2013-08-04.tar.gz
logs_2013-08-05.tar.gz
Я знаю, что команда для распаковки одного файла
tar -xvf {tarball.tar} {path/to/file}
И добавив -C для указания выходной папки, команда для одного архива выглядит так:
tar -xvf logs_2013-08-01.tar.gz -C 2013-08-01/ /var/logs/audit
Но как я могу сделать цикл, чтобы все распаковать?
Использовать atool(1)
. Он уже упакован для многих дистрибутивов.
Просто беги:
$ atool -x -e *.tar.gz
для распаковки и распаковки каждого файла в его собственном каталоге.
Вы можете попробовать это (проверено на Linux / bash):
for pkg in logs_*.tar.gz; do
where="${pkg#logs_}"
where="${where%.tar.gz}/"
[ -d "$where" ] || mkdir "$where"
tar zxfv $pkg -C "$where" /var/logs/audit
done
Просто вы перебираете все архивы tgz в текущем каталоге, затем берете часть «дата» из его имени, создаете требуемый каталог и, наконец, извлекаете их.
Вы можете просто перебрать файлы вроде этого
#!/bin/bash
# Pass the name of the file to unpack on the command line $1
for file in *.gz
do
dir=$(echo "$file" | cut -c 6-15)
tar -xvf "$file" -C "$dir" "$1"
done