Skip to content

Arxivlash va siqish: tar, gzip, zip

Backup olish, loglarni uzoq muddat saqlash yoki fayllarni boshqa serverga uzatish — bularning barchasida bir nechta faylni bitta obyektga yig'ish va uning hajmini kichraytirish kerak bo'ladi. Linuxda bu ikki alohida vazifa: arxivlash (bir nechta faylni bitta faylga yig'ish) va siqish (hajmni kamaytirish) odatda ikki xil vosita bilan, lekin birgalikda ishlatiladi.

Bu maqola fayl va matnni qidirish va matnni qayta yozish maqolalaridan keyin — tahlil qilingan yoki tozalangan fayllarni saqlash va uzatish bosqichini yopadi.

O'quv maqsadlari

Maqolani tugatgach:

  • arxivlash (tar) va siqishning (gzip) alohida vazifalar ekanini tushunasiz;
  • tar bilan arxiv yaratish, ko'rish va ochish amallarini bajara olasiz;
  • gzip/gunzip va tarning siqilgan arxiv bilan bevosita ishlashini bilasiz;
  • zip/unzipni qachon tar.gzdan afzal tanlashni bilasiz;
  • arxivni ochishdan oldin tarkibini tekshirish odatini qo'llaysiz.

Laboratoriya ma'lumotlari

mkdir -p ~/lab/archive/project/{src,logs}
cd ~/lab/archive
printf 'def main():\n    pass\n' > project/src/app.py
printf 'level=INFO msg=started\n' > project/logs/app.log
printf 'level=ERROR msg=timeout\n' >> project/logs/app.log
find project -type f -printf '%p %s bytes\n'

tar: fayllarni bitta arxivga yig'ish

tar (tape archive) nomi lentaga yozish davridan qolgan, lekin bugun ham eng ko'p ishlatiladigan arxivlash vositasi. U o'zi siqmaydi — faqat fayl va katalog tuzilmasini, ruxsatlar va egalikni saqlagan holda bitta faylga yig'adi.

Arxiv yaratish

tar -cvf project.tar project
  • -c — create (yangi arxiv yaratish);
  • -v — verbose, qaysi fayllar qo'shilayotganini ko'rsatadi;
  • -f project.tar — arxiv fayl nomi. -f har doim oxirgi flag va undan keyin darhol fayl nomi kelishi kerak.
project/
project/src/
project/src/app.py
project/logs/
project/logs/app.log

Arxiv tarkibini ochmasdan ko'rish

tar -tvf project.tar
drwxr-xr-x user/user         0 2026-07-25 10:00 project/
drwxr-xr-x user/user         0 2026-07-25 10:00 project/src/
-rw-r--r-- user/user        21 2026-07-25 10:00 project/src/app.py
drwxr-xr-x user/user         0 2026-07-25 10:00 project/logs/
-rw-r--r-- user/user        48 2026-07-25 10:00 project/logs/app.log

-t — list, arxivni diskka yozmasdan tarkibini chiqaradi. Ishonchsiz manbadan kelgan arxivni ochishdan oldin har doim shu buyruq bilan tekshirish tavsiya etiladi.

Warning

Arxivni tarkibini oldindan tekshirmasdan ochish xavfli bo'lishi mumkin: arxiv ichidagi fayl yo'li ../ bilan boshlanib, joriy katalogdan tashqariga yozishga urinishi mumkin (path traversal). Zamonaviy GNU tar bunday absolyut yoki .. bilan boshlanuvchi yo'llarni sukut bo'yicha rad etadi va ogohlantiradi, lekin ishonchsiz arxivni avval -tvf bilan ko'rib chiqish baribir yaxshi odat.

Arxivni ochish

mkdir extracted
tar -xvf project.tar -C extracted
find extracted -type f
  • -x — extract;
  • -C extracted — arxivni joriy katalog o'rniga ko'rsatilgan katalogga ochish. -C ishlatilmasa, tar arxivdagi yo'llarni joriy katalogka nisbatan ochadi.

Muayyan faylni arxivdan olish

tar -xvf project.tar project/logs/app.log -C extracted

Bu butun arxivni emas, faqat ko'rsatilgan yo'lni ochadi. Yo'l tar -tvf natijasidagi aynan shu shaklda yozilishi kerak.

Siqish: gzip va tar bilan birgalikda

tar o'zi siqmaydi. Hajmni kichraytirish uchun natijaviy .tar fayl alohida siqish vositasidan (odatda gzip) o'tkaziladi — yoki tarning o'ziga integratsiya qilingan flag orqali bitta buyruqda.

Bitta buyruqda arxivlash va siqish

tar -czvf project.tar.gz project
ls -lh project.tar project.tar.gz

-z flagi targa natijani gzip orqali o'tkazishni buyuradi. Kengaytma odatda .tar.gz yoki qisqartirilgan .tgz deb yoziladi — bu shunchaki konventsiya, tar kengaytmaga qarab ishlamaydi, -z flagining o'ziga tayanadi.

Siqilgan arxivni ochish

tar -xzvf project.tar.gz -C extracted

-x (extract) va -z (gzip) birga ishlatiladi — tar avval gunzip qiladi, so'ng arxivni ochadi.

Faylni alohida siqish: gzip/gunzip

gzip bitta faylni siqadi va odatda asl faylni .gz kengaytmali siqilgan nusxaga almashtiradi:

cp project/logs/app.log app.log.copy
gzip app.log.copy
ls -l app.log.copy.gz

app.log.copy endi mavjud emas — gzip uni siqib, o'rniga app.log.copy.gz qoldiradi. Asl faylni saqlab qolish kerak bo'lsa:

gzip -k project/logs/app.log
ls -l project/logs/app.log project/logs/app.log.gz

-k (keep) asl faylni o'chirmaydi.

Siqilgan faylni asl holiga qaytarish:

gunzip -k project/logs/app.log.gz

Siqilgan faylni ochmasdan ichini ko'rish:

zcat project/logs/app.log.gz

zcatgunzip -c bilan bir xil, natijani faylga yozmasdan stdoutga chiqaradi.

Siqish darajasi va hajm-tezlik nisbati

gzip -k -9 project/logs/app.log
mv project/logs/app.log.gz project/logs/app.log.max.gz
gzip -k -1 project/logs/app.log
mv project/logs/app.log.gz project/logs/app.log.fast.gz
ls -l project/logs/app.log.max.gz project/logs/app.log.fast.gz

-1 dan -9 gacha (sukut bo'yicha -6) siqish darajasini bildiradi: past qiymat tezroq, lekin kamroq siqadi; yuqori qiymat sekinroq, ko'proq siqadi. Kichik matn fayllarida farq ko'pincha sezilarsiz, katta log fayllarida esa aniq ko'rinadi.

zip/unzip: platformalararo muqobil

.tar.gz Linux/Unix ekotizimida standart, lekin Windows foydalanuvchisiga arxiv yuborish kerak bo'lsa yoki arxivning ichidan bitta faylni, hammasini qayta siqmasdan yangilash kerak bo'lsa, zip formati qulayroq.

sudo apt install zip unzip
zip -r project.zip project
unzip -l project.zip
  • -r — katalogni rekursiv qo'shish;
  • unzip -ltar -tvf ga o'xshab, ochmasdan tarkibni ko'rsatadi.
mkdir extracted-zip
unzip project.zip -d extracted-zip

tar.gz va zip orasidagi farq

Xususiyat tar.gz zip
Unix ruxsatlari va egalikni saqlash Ha, to'liq Qisman, platformaga bog'liq
Windows'da native qo'llab-quvvatlash Yo'q (qo'shimcha dastur kerak) Ha
Arxiv ichidan bitta faylni almashtirish, hammasini qayta siqmasdan Yo'q — butun arxivni qayta yaratish kerak Ha, zip -u bilan
Linux ekotizimidagi odatiy standart Ha (backup, paket, source tarqatish) Kamroq, asosan cross-platform holatlarda

Linux serverlar orasidagi backup va deployment uchun odatda tar.gz, tashqi (ayniqsa Windows) foydalanuvchiga fayl yuborish uchun ko'pincha zip tanlanadi.

Amaliy ssenariy: log katalogini arxivlab, tekshirib, saqlash

Muammo: project/logs katalogini backup sifatida siqib, arxiv buzilmaganini tasdiqlab, keyin asl loglarni tozalash kerak.

backup_dir=$HOME/lab/archive/backups
mkdir -p "$backup_dir"
stamp=$(date -u +%Y%m%dT%H%M%SZ)
archive="$backup_dir/logs-$stamp.tar.gz"

tar -czf "$archive" -C "$HOME/lab/archive/project" logs

Arxiv yaratilgach, uni ochmasdan yaxlitligini tekshirish:

gzip -t "$archive" && echo "gzip yaxlitligi OK"
tar -tzf "$archive" > /dev/null && echo "tar tuzilishi OK"
  • gzip -t — siqish darajasidagi yaxlitlikni tekshiradi (fayl buzilmaganmi);
  • tar -tzf ... > /dev/null — arxiv ichidagi tar tuzilmasini o'qib chiqadi, xato bo'lsa non-zero status qaytaradi.

Faqat ikkala tekshiruv ham muvaffaqiyatli bo'lgandan keyin asl fayllarni o'chirish xavfsizroq:

if gzip -t "$archive" && tar -tzf "$archive" > /dev/null; then
    echo "Arxiv tekshirildi: $archive"
else
    echo "Arxiv buzilgan, asl fayllar saqlanadi" >&2
    exit 1
fi

Danger

Arxivlangandan keyin asl fayllarni avtomatik o'chiradigan skriptda arxiv yaxlitligini tekshirish shart bo'lgan qadam, ixtiyoriy emas. Diskto'lishi yoki uzilgan jarayon natijasida yarim yozilgan arxiv "muvaffaqiyatli yaratildi" deb hisoblanib, asl ma'lumot esa allaqachon o'chirilgan bo'lishi mumkin.

Ko'p uchraydigan xatolar

  • tar o'zi siqadi deb o'ylash — siqish uchun -z (yoki boshqa siqish flagi) alohida kerak;
  • -f flagidan keyin fayl nomini boshqa flag bilan aralashtirib yozish (masalan, tar -fcv-f dan keyin darhol fayl nomi kelishi kerak);
  • ishonchsiz arxivni oldindan -tvf/unzip -l bilan ko'rmasdan to'g'ridan-to'g'ri ochish;
  • gzip fayl.log asl faylni saqlab qoladi deb o'ylash — -k berilmasa asl fayl siqilgan nusxaga almashadi;
  • backup skriptida arxiv yaxlitligini tekshirmasdan asl fayllarni o'chirish;
  • .tar.gz ni Windows foydalanuvchisiga hech qanday izohsiz yuborish — maxsus dastursiz ochish qiyinroq bo'lishi mumkin, bunday holatda zip ko'proq mos.

Amaliy mashqlar

  1. project katalogini tar -czvf bilan siqing va hajmini siqilmagan tar -cvf natijasi bilan solishtiring.
  2. Yaratilgan project.tar.gz arxivini -tzf bilan ochmasdan tekshiring, so'ng faqat project/logs/app.log faylini undan chiqarib oling.
  3. gzip -k -1 va gzip -k -9 natijalarining hajmini solishtiring va farq sababini tushuntiring.
  4. project katalogini zip -r bilan arxivlang, unzip -l bilan tarkibini ko'ring, so'ng tar.gz bilan zip hajmini taqqoslang.
  5. Yuqoridagi amaliy ssenariydagi tekshiruv skriptini ataylab buzilgan arxiv (masalan, faylning oxirgi baytlarini truncate bilan kesib) bilan sinab ko'ring va u xatoni to'g'ri aniqlashini tasdiqlang.

Tekshiruv mezoni: har bir arxiv uchun uni ochishdan oldin tarkibini qanday tekshirganingizni va nega aynan shu format (tar.gz yoki zip) tanlanganini izohlay olishingiz kerak.

Xulosa

tar fayl va katalog tuzilmasini bitta arxivga yig'adi, siqish esa -z flagi (yoki alohida gzip) orqali qo'shiladi. Arxivni ochishdan oldin -tvf/unzip -l bilan tarkibini ko'rish va gzip -t/tar -tzf bilan yaxlitligini tekshirish — ayniqsa ishonchsiz manbadan kelgan yoki asl fayllarni o'chirishdan oldingi backup arxivlar uchun muhim odat. zip esa Windows bilan muvofiqlik yoki arxiv ichidagi faylni qisman yangilash kerak bo'lganda tar.gzga muqobil sifatida ishlatiladi.

Manbalar