thiago_alvarez
@thiago_alvarez
Student

Архивирование и сжатие в линукс?

Зачем вообще нужно архивировать файлы?
Раньше думал, что архивировать с tar нужно для того, чтобы собрать все файлы в один файл, а уже удобно потом их сжимать.
Но ведь можно сразу одной командой сжать сразу множество файлов, без архивации.
Просветите плз
  • Вопрос задан
  • 943 просмотра
Решения вопроса 1
saboteur_kiev
@saboteur_kiev Куратор тега Linux
software engineer
tar изначально был сделан для упаковывания файлов и каталогов в ленточный архив (одним потоком).

gzip это потоковый архиватор, он не знает про файлы, он пакует поток. На ходу. Быстро. Он не анализирует файл целиком, поэтому алгоритм, который используется в gzip, сейчас используется практически везде (в модемах, в сетевых карточках и так далее).

исторически сложилось так, что для упаковки с компрессией нескольких файлов, использовали связку tar+gzip, что стало стандартом де-факто.
В современном мире, стандарт бывает важнее нескольких процентов сжатия, поэтому .tgz - вполне популярное и надежное решение, которое будет работать на любом линукс. А вот zip есть далеко не везде. Вы видимо не сталкивались с урезанными версиями линуксов в embedded, да и даже в RHEL7 в стандартную поставку он не входит, надо ставить отдельно.

Ну и напоследок - tar умеет хранить posix права доступа, а zip или rar - нет. Поэтому .tgz формат еще надолго останется с нами.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@pfg21
ex-турист
сжатие без архивации менее эффективно, хотя удобнее в доступе.
для холодного бекапа или пакетирования данных удобнее держать все в одном комплекте.

жаль что в tar и cpio нет индекса файлов.
надо поковырять рар5, туда кажись *никс атрибуты файла завезли.
Ответ написан
Комментировать
Zoominger
@Zoominger
System Integrator
В чём проблема одной командой заархивировать в tar, а потом в gzip или bzip2?
tar -cvjf arc.tar.bz2 /path
например.
Ответ написан
@Pr12
Для архивации используется tar. Она объединяет несколько небольших файлов в один, с целью более удобной последующей передачи, хранения, шифрования. 3
Для сжатия используются другие утилиты, в зависимости от алгоритма сжатия: zip, bz, xz, lzma и т. д.
пример

TEMP_ARCHIVE="/tmp/$(basename "$OUTPUT_ARCHIVE").tar"
LOG_FILE="./archive_script.log"

# Создание tar-архива
tar -cvf "$TEMP_ARCHIVE" "${INPUT_FILES[@]}"
if [ $? -ne 0 ]; then
echo "Failed to create tar archive"
exit 1
fi

# Сжатие архива
START_TIME=$(date +%s)
if [ "$COMPRESSION_METHOD" == "gzip" ]; then
gzip -c "$TEMP_ARCHIVE" > "$OUTPUT_ARCHIVE"
elif [ "$COMPRESSION_METHOD" == "bzip2" ]; then
bzip2 -c "$TEMP_ARCHIVE" > "$OUTPUT_ARCHIVE"
fi

END_TIME=$(date +%s)

# Проверка успешности сжатия
if [ $? -ne 0 ]; then
echo "Failed to compress archive"
rm "$TEMP_ARCHIVE"
exit 1
fi

# Удаление временного архива
rm "$TEMP_ARCHIVE"

# Получение размеров файлов
ORIGINAL_SIZE=$(du -sb "${INPUT_FILES[@]}" | awk '{total += $1} END {print total}')
COMPRESSED_SIZE=$(du -sb "$OUTPUT_ARCHIVE" | cut -f1)

# Логирование информации
{
echo "[$(date +"%Y-%m-%d %H:%M:%S")] Created archive '$OUTPUT_ARCHIVE' using '$COMPRESSION_METHOD'"
echo "Original size: $ORIGINAL_SIZE bytes"
echo "Compressed size: $COMPRESSED_SIZE bytes"
echo "Compression time: $(($END_TIME - $START_TIME)) seconds"
} >> "$LOG_FILE"

# Успешное завершение
echo "Archive '$OUTPUT_ARCHIVE' created successfully."
exit 0
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы