Распакуйте .tar.gz и измените файлы результатов - PullRequest
0 голосов
/ 02 октября 2019

Я хотел написать сценарий bash, который будет распаковывать архивы .tar.gz и для каждого файла результатов он будет устанавливать дополнительный атрибут с именем исходного архива. Просто чтобы узнать, каково происхождение распакованного файла.

Я попытался сохранить внутренние файлы в массиве и затем зациклить их.

for archive in "$1"*.tar.gz; do
    if [ -f "${archive}" ]
        then
            readarray -t fileNames < <(tar tzf "$archive")
            for file in "${fileNames}"; do
                echo "${file}"
                tar xvzf "${archive}" -C "$1" --no-wildcards "${file}" &&
                attr -s package -V "${archive}" "${file}"
            done
    fi
done

В результате только одинфайл извлечен, и дополнительный атрибут не установлен.

1 Ответ

1 голос
/ 02 октября 2019
#! /bin/bash

for archive in "$1"*.tar.gz; do
    if [ -f "${archive}" ] ; then
        # Unpack the archive into subfolder $1
        tar xvf "$archive" -C "$1"
        # Assign attributes
        tar tf "$archive" | (cd "$1" && xargs -t -L1 attr -s package -V "$archive" )
    fi
done

Примечания:

  1. Скрипт распаковывает каждый архив с одним «tar». Это более эффективно, чем распаковка одного файла за раз. Это также позволяет избежать проблем с распаковкой папок, что приведет к ненужной повторной работе.
  2. Скрипт использует 'attr'. Будет лучше использовать 'setfattr', если он поддерживается в целевой файловой системе для установки атрибутов для нескольких файлов с несколькими вызовами (используя xargs, с несколькими файлами на команду)
  3. Не ясно, какова структуравыходная папка. Исходя из вопроса, похоже, что все архивы будут помещены в одну и ту же папку «$ 1». Следующее решение предполагает, что это предполагаемое поведение, и что каждый архив будет иметь разные имена файлов. Если каждый архив нужно поместить в отдельную подпапку, его будет проще / эффективнее реализовать.
...