Назад | Перейти на главную страницу

bash gunzip | распаковать несколько файлов в отдельные папки

У меня есть список файлов .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