Архивировать несколько подкаталогов в отдельные архивы с помощью gzip на Linux?

Вопрос или проблема

Как я могу сжать поддиректории в отдельные архивы?

Пример:

directory
 subdir1
 subdir2

Должны быть созданы subdir1(.tar).gz и subdir2(.tar).gz

Этот небольшой скрипт, кажется, лучший вариант, учитывая ваши требования:

cd directory
for dir in */
do
  base=$(basename "$dir")
  tar -czf "${base}.tar.gz" "$dir"
done

Он правильно обрабатывает каталоги с пробелами в названиях.

Как насчет этого: find * -maxdepth 0 -type d -exec tar czvf {}.tar.gz {} \;

Объяснение: Вы выполняете поиск для всех элементов в текущем каталоге. Maxdepth 0 не позволяет рекурсию глубже, чем заданные аргументы. (В данном случае *, или все элементы в вашем текущем каталоге) Аргумент ‘d’ для “-type” соответствует только каталогам. Затем exec запускает tar на всем, что подходит. ({} заменяется совпадающим файлом)

Это создаст файл с именем blah.tar.gz для каждого файла в каталоге с именем blah.

$ cd directory
$ for dir in `ls`; do tar -cvzf ${dir}.tar.gz ${dir}; done

Если у вас в каталоге есть не только каталоги, но и файлы (так как ls вернет все в каталоге), то используйте это:

$ cd directory
$ for dir in `find . -maxdepth 1 -type d  | grep -v "^\.$" `; do tar -cvzf ${dir}.tar.gz ${dir}; done

Команда grep -v исключает текущий каталог, который по умолчанию отображается в команде find.

следуя ответу @Philip Reynolds (необходима репутация 50 очков, чтобы прокомментировать, поэтому добавляю…)

*for dir in `find . -maxdepth 1 -type d  | grep -v "^\.$" `; do echo "tar -cvzf ${dir}.tar.gz ${dir}"; done*

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

.

Ответ или решение

Для решения задачи сжатия нескольких подкаталогов в отдельные архивы в системе Linux, необходимо понимать, как работают утилиты командной строки для обработки каталогов и файлов. Основная утилита, о которой идет речь, это tar, которая может архивировать файлы и директории, как в несжатом, так и в сжатом виде (с использованием других утилит, таких как gzip или bzip2).

Теория

Команда tar (от английского tape archive) используется для создания архивов. Она поддерживает как сжатие, так и распаковку сжатых архивов. Комбинация tar и gzip (кратко используются через -czf) позволяет создать сжатый архив формата .tar.gz. Основные компоненты этой команды:

  • -c: Создать новый архив.
  • -z: Сжать используя gzip.
  • -f: Указать имя файла архива.

Эта команда создаст файл архива, содержащий указанную директорию и все её содержимое.

Пример

Рассмотрим несколько примеров для архивации всех подкаталогов в текущей директории отдельно.

  1. Использование цикла for и basename:

    cd directory
    for dir in */
    do
     base=$(basename "$dir")
     tar -czf "${base}.tar.gz" "$dir"
    done

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

  2. Использование команды find:

    find * -maxdepth 0 -type d -exec tar czvf {}.tar.gz {} \;

    Здесь команда find используется для поиска всех объектов в текущей директории на уровне глубины 0, фильтруя только подкаталоги. Команда -exec выполняет tar с каждым найденным каталогом.

  3. Использование ls в составе цикла:

    cd directory
    for dir in `ls`; do tar -cvzf ${dir}.tar.gz ${dir}; done

    Этот метод может быть менее надёжен, так как ls возвращает все объекты в директории, включая файлы.

  4. Фильтрация с использованием grep:

    cd directory
    for dir in `find . -maxdepth 1 -type d  | grep -v "^\.$"`; do tar -cvzf ${dir}.tar.gz ${dir}; done

    В данном примере команда grep используется для исключения текущей директории из списка найденных объектов, которые возвращает find.

Применение

При выборе подходящего метода учитывать следующие факторы:

  • Если вы работаете только с подкаталогами, и они не содержат пробелов в именах, любой из предложенных методов будет работать.
  • Если в именах каталогов используются пробелы, рекомендуется использовать первый или второй метод, так как они решают проблему корректной обработки путей с пробелами.
  • Всегда проверяйте, что директории, в которых выполняются команды, не содержат нежелательных файлов, которые могут случайно быть архивированы.
  • Чтобы избежать случайных ошибок, рекомендуется сначала выводить команды без их выполнения (например, через echo), проверяя, правильно ли они выведены, прежде чем их запускать.

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

Таким образом, использование базовых утилит командной строки, таких как tar и gzip, наряду с правильно сформулированными сценариями, представляет собой мощное средство для управления архивами в системах, основанных на Linux.

Оцените материал
Добавить комментарий

Капча загружается...