Упаковка и сжатие файлов

LinuxBeginner
Практиковаться сейчас

Введение

Упаковка и сжатие решают связанные, но разные задачи. Архив объединяет дерево каталогов в единый поток данных, сохраняя имена и структуру. Сжатие представляет данные в более компактном виде. Файл .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-архива. Самое важное — вы восстанавливали данные в отдельные каталоги и сравнивали содержимое, а не предполагали, что одного создания архива достаточно.