Вопрос или проблема
Как я могу сжать поддиректории в отдельные архивы?
Пример:
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: Указать имя файла архива.
Эта команда создаст файл архива, содержащий указанную директорию и все её содержимое.
Пример
Рассмотрим несколько примеров для архивации всех подкаталогов в текущей директории отдельно.
-
Использование цикла
for
иbasename
:cd directory for dir in */ do base=$(basename "$dir") tar -czf "${base}.tar.gz" "$dir" done
В этом примере используется цикл для перебора всех подкаталогов в директории. Команда
basename
извлекает имя каталога из полного пути, что позволяет создать сжатый архив с желаемым именем. -
Использование команды
find
:find * -maxdepth 0 -type d -exec tar czvf {}.tar.gz {} \;
Здесь команда
find
используется для поиска всех объектов в текущей директории на уровне глубины 0, фильтруя только подкаталоги. Команда-exec
выполняетtar
с каждым найденным каталогом. -
Использование
ls
в составе цикла:cd directory for dir in `ls`; do tar -cvzf ${dir}.tar.gz ${dir}; done
Этот метод может быть менее надёжен, так как
ls
возвращает все объекты в директории, включая файлы. -
Фильтрация с использованием
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.