Введение
Упаковка и сжатие решают связанные, но разные задачи. Архив объединяет дерево каталогов в единый поток данных, сохраняя имена и структуру. Сжатие представляет данные в более компактном виде. Файл .tar является архивом; файл .gz содержит данные, сжатые с помощью gzip; файл .tar.gz — это tar-архив, сжатый с помощью gzip.
Вы создадите небольшой проект, создадите архивы в разных форматах, проверите содержимое архива до извлечения, восстановите его в отдельный каталог и сравните восстановленные данные с исходными. Такой рабочий процесс «проверка — извлечение — проверка результата» позволяет избежать случайной перезаписи исходных файлов.
Создайте дерево каталогов для сохранения
На этом шаге вы создадите небольшое исходное дерево каталогов и зафиксируете, какие данные должны сохраниться после упаковки и извлечения.
Создайте каталоги для конфигурации, заметок и данных:
cd /home/labex/project/archive-lab
mkdir -p source/{config,notes,data}
Запишите в три файла разное содержимое:
printf 'mode=training\nport=8080\n' > source/config/app.conf
printf 'Archive the complete project tree.\n' > source/notes/README.txt
printf 'alpha,beta,gamma\n1,2,3\n' > source/data/sample.csv
Используйте find, чтобы просмотреть обычные файлы относительно исходного каталога:
find source -type f -printf '%P\n' | sort
Создайте и проверьте tar-архив
На этом шаге вы упакуете исходное дерево без сжатия и проверите имена элементов архива.
Основные буквы операций tar: c — создать архив, t — вывести список содержимого, x — извлечь, f — указать имя файла архива. Используйте -C, чтобы перед добавлением source изменить рабочий каталог tar. Это позволяет не сохранять длинный абсолютный путь:
cd /home/labex/project/archive-lab
tar -cf project.tar -C /home/labex/project/archive-lab source
Исходное дерево по-прежнему существует, потому что создание архива читает файлы, а не перемещает их. Проверьте архив и один из исходных файлов:
ls -lh project.tar
ls -l source/config/app.conf
Выведите список элементов до извлечения:
tar -tf project.tar > tar-members.txt
cat tar-members.txt
Имя каждого элемента должно начинаться с source/, а в начале не должно быть /. Относительные имена элементов делают восстановление безопаснее и обеспечивают переносимость архива.
Безопасно извлеките архив и сравните результат
На этом шаге вы извлечёте архив в пустой каталог назначения, а не поверх исходных файлов, и сравните оба дерева.
Создайте каталог для восстановления и укажите его с помощью -C:
cd /home/labex/project/archive-lab
mkdir tar-restore
tar -xf project.tar -C tar-restore
Проверьте восстановленные пути:
find tar-restore -type f -printf '%P\n' | sort
Выполните рекурсивное сравнение. Если деревья совпадают, diff -r ничего не выводит и завершается успешно:
diff -r source tar-restore/source
echo "tar restore matches source" > tar-restore-ok.txt
cat tar-restore-ok.txt
Сожмите и распакуйте один файл с помощью Gzip
На этом шаге вы увидите, чем gzip отличается от архива: gzip работает с одним обычным файлом.
Скопируйте файл, чтобы исходное дерево осталось без изменений, а затем сожмите копию:
cd /home/labex/project/archive-lab
cp source/data/sample.csv sample-copy.csv
gzip sample-copy.csv
По умолчанию gzip заменяет входной файл файлом sample-copy.csv.gz:
ls -lh sample-copy.csv.gz
file sample-copy.csv.gz
Распакуйте файл и сравните его содержимое с исходным:
gunzip sample-copy.csv.gz
cmp source/data/sample.csv sample-copy.csv
echo "gzip round trip matches" > gzip-round-trip-ok.txt
cat gzip-round-trip-ok.txt
Сам по себе Gzip не упаковывает дерево каталогов; такую структуру предоставляет tar.
Создайте и восстановите сжатый tar-архив
На этом шаге вы объедините упаковку с помощью tar и сжатие с помощью gzip. Параметр z указывает tar передать данные архива через gzip.
Создайте project.tar.gz и проверьте его с помощью соответствующих параметров -tzf:
cd /home/labex/project/archive-lab
tar -czf project.tar.gz -C /home/labex/project/archive-lab source
tar -tzf project.tar.gz > targz-members.txt
cat targz-members.txt
Извлеките архив в отдельный каталог и проверьте дерево:
mkdir targz-restore
tar -xzf project.tar.gz -C targz-restore
diff -r source targz-restore/source
echo "tar.gz restore matches source" > targz-restore-ok.txt
cat targz-restore-ok.txt
Расширения сообщают людям и инструментам формат файла: .tar.gz явно указывает на tar-архив, сжатый с помощью gzip.
Обменяйтесь проектом в виде Zip-архива
На этом шаге вы создадите и проверите Zip-архив — распространённый формат в Linux, macOS и Windows.
Команда zip -r рекурсивно добавляет дерево каталогов. Запустите её из корневого каталога лаборатории, чтобы сохранённые пути начинались с source/:
cd /home/labex/project/archive-lab
zip -r project.zip source
Выведите список элементов без извлечения:
unzip -l project.zip
Используйте -d, чтобы выбрать отдельный каталог назначения, а затем сравните результат:
unzip -q project.zip -d zip-restore
diff -r source zip-restore/source
echo "zip restore matches source" > zip-restore-ok.txt
cat zip-restore-ok.txt
Итоги
Вы отделили упаковку от сжатия, создали tar-архивы и просмотрели их содержимое, выполнили полный цикл сжатия и распаковки с помощью gzip, объединили обе операции в формате .tar.gz и обменялись тем же деревом в виде Zip-архива. Самое важное — вы восстанавливали данные в отдельные каталоги и сравнивали содержимое, а не предполагали, что одного создания архива достаточно.



