Tarkibga o'tish

Arxivlash va siqish: tar, gzip, zip

Zaxira nusxa olish, loglarni uzoq muddat saqlash yoki fayllarni boshqa serverga yuborishda doim ikki narsa kerak bo'ladi: bir nechta faylni bitta obyektga yig'ish va uning hajmini kichraytirish. Linux’da bular ikki alohida vazifa: arxivlash (bir nechta faylni bitta faylga joylash) va siqish (hajmni kamaytirish). Odatda ularni ikki xil vosita bajaradi, lekin deyarli har doim birga ishlatiladi.

Bu maqola Fayl va matn qidirish va Matnni qayta yozish: sed va awk maqolalarining davomi: fayllar topilib, tartibga keltirilgach, ko'pincha ularni saqlab qo'yish yoki boshqa joyga uzatish kerak bo'ladi. Quyida tar bilan arxiv yaratish, uning ichini ko'rish va ochishni, gzip bilan siqishni, zip qachon tar.gz dan qulayroq ekanini va arxivga ishonishdan oldin uni tekshirish odatini ko'rib chiqamiz.

Laboratoriyani tayyorlash

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

tar: fayllarni bitta arxivga joylash

tar nomi ("tape archive" — lenta arxivi) ma’lumotlar magnit lentaga yozilgan davrdan qolgan, lekin u bugun ham eng ko'p ishlatiladigan arxivlash vositasi. tar ning o'zi hech narsani siqmaydi: u faqat fayl va kataloglarni katalog tuzilmasi, ruxsatlar va egalik ma’lumotlarini saqlagan holda bitta faylga yig'adi.

Arxiv yaratish

tar -cvf project.tar project
  • -c: yangi arxiv yaratadi.
  • -v: batafsil rejim (verbose), qaysi fayllar qo'shilayotganini ko'rsatadi.
  • -f project.tar: arxiv fayli nomi. Bayroqlar birga yozilganda -f oxirgi bo'lishi va undan keyin darhol fayl nomi kelishi kerak.
project/
project/src/
project/src/app.py
project/logs/
project/logs/app.log

Ochmasdan ichini ko'rish

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

-t diskka hech narsa yozmasdan arxiv mazmunini ro'yxat qilib chiqaradi. Ishonchsiz manbadan kelgan arxivni ochishdan oldin shu buyruqni bajarish yaxshi odat.

Warning

Arxivni oldin ko'rib chiqmasdan ochish xavfli bo'lishi mumkin: arxiv ichidagi ../ bilan boshlanadigan yo'l joriy katalogdan tashqariga yozishga urinishi mumkin (path traversal). Zamonaviy GNU tar sukut bo'yicha absolyut yo'llarni va .. bilan boshlanadigan yo'llarni rad etadi va ular haqida ogohlantiradi. Shunga qaramay, ishonchsiz arxivni avval -tvf bilan tekshirishni odat qilish foydali.

Warning

Arxivni root sifatida ochish oddiy foydalanuvchi sifatida ochishdan xavfliroq. GNU tar egalikni, vaqt tamg'alarini va -p bilan (root sifatida ishlaganda u avtomatik yoqiladi) asl ruxsat bitlarini, jumladan setuid/setgid ni ham tiklaydi. Demak, zararli arxiv tizimga to'g'ridan-to'g'ri root egaligidagi setuid dasturni tashlab ketishi mumkin. Ishonchsiz arxivlarni faqat -tvf bilan ko'rib chiqqandan keyin, imtiyozsiz foydalanuvchi sifatida va bo'sh katalogga oching.

Arxivni ochish

mkdir extracted
tar -xvf project.tar -C extracted
find extracted -type f
  • -x: arxivni ochadi (extract).
  • -C extracted: arxivni joriy katalog o'rniga ko'rsatilgan katalogga ochadi. -C bo'lmasa, tar yo'llarni joriy katalogga nisbatan ochadi.

Bitta faylni ajratib olish

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

Bu buyruq butun arxivni emas, faqat ko'rsatilgan yo'lni ochadi. Yo'l tar -tvf ko'rsatgani bilan aynan bir xil bo'lishi kerak.

Siqish: tar bilan birga gzip

tar ning o'zi siqmaydi. Hosil bo'lgan .tar faylning hajmini kichraytirish uchun uni alohida siqish vositasidan — odatda gzip dan — o'tkazish kerak. Buni ikkinchi qadam sifatida yoki tar ning o'zidagi bayroq orqali bitta buyruqda bajarish mumkin.

Bitta buyruqda arxivlash va siqish

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

-z bayrog'i tar ga o'z natijasini gzip orqali o'tkazishni buyuradi. Kengaytma odatda .tar.gz yoki qisqartirib .tgz deb yoziladi. Bu shunchaki nomlash odati: tar qanday ishlashni kengaytmaga qarab emas, faqat -z bayrog'iga qarab aniqlaydi.

Siqilgan arxivni ochish

tar -xzvf project.tar.gz -C extracted

-x (ochish) va -z (gzip) birga ishlatiladi: tar avval gunzip ga teng amalni bajaradi, so'ng arxivni ochadi.

Bitta faylni siqish: gzip/gunzip

gzip bitta faylni siqadi va sukut bo'yicha asl faylni .gz qo'shimchali siqilgan nusxa bilan 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 ni qoldirdi. Asl faylni saqlab qolish uchun:

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

-k (keep — saqlash) asl faylni joyida qoldiradi.

Siqilgan faylni tiklash:

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

Siqilgan faylni diskka ochmasdan, mazmunini ko'rish:

zcat project/logs/app.log.gz

zcat gunzip -c bilan bir xil: natijani faylga emas, standart chiqishga yozadi.

Siqish darajasi: hajm yoki tezlik

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 bo'lgan qiymatlar (sukut bo'yicha -6) siqish darajasini belgilaydi: kichik qiymat tezroq ishlaydi, lekin kamroq siqadi; katta qiymat sekinroq, lekin ko'proq siqadi. Kichik matn fayllarida farq ko'pincha sezilmaydi, katta log fayllarida esa yaqqol ko'rinadi.

Siqish vositasini tanlash: gzip, bzip2, xz, zstd

Sukut bo'yicha gzip ishlatiladi, lekin tar bir nechta siqish vositasi bilan ishlay oladi. Ularning har biri tezlik va siqish darajasi o'rtasidagi muvozanatning boshqa nuqtasida turadi:

Bayroq Vosita Odatiy qo'llanishi
-z gzip Tez, hamma joyda bor; moslik muhim bo'lganda xavfsiz tanlov
-j bzip2 gzip’dan kichikroq siqadi, lekin sezilarli sekinroq — hozir asosan boshqa vositalar bilan almashtirilgan
-J xz Klassik vositalar ichida eng yaxshi siqadi, lekin eng sekin va eng ko'p xotira talab qiladi — bir marta yozilib, ko'p marta yuklab olinadigan arxivlar uchun yaxshi (manba kod tarball’lari, reliz fayllari)
--zstd zstd Tezligi gzip’ga yaqin, siqish darajasi ancha yaxshi, ochishi juda tez — o'rnatilgan joyda zamonaviy standart tanlov
tar -cJvf project.tar.xz project          # xz
tar --zstd -cvf project.tar.zst project   # zstd

Ochish yaratishning aksi (tar -xJf, tar --zstd -xf), lekin zamonaviy GNU tar ochishda siqish vositasini o'zi aniqlaydi, shuning uchun oddiy tar -xf project.tar.zst ham odatda ishlayveradi. Amaliy qoida: vosita mavjud bo'lsa, muntazam zaxira nusxalar uchun zstd; keng tarqatiladigan fayldan oxirgi bir necha foizni ham siqib olish kerak bo'lsa, xz; qabul qiluvchi tomonda boshqa vositalar borligiga kafolat bo'lmasa, gzip.

zip/unzip: turli platformalar uchun muqobil

Linux va Unix dunyosida .tar.gz standart hisoblanadi. Lekin arxivni Windows foydalanuvchisiga yuborish yoki arxiv ichidagi 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 ichidagilari bilan birga (rekursiv) qo'shadi.
  • unzip -l: tar -tvf kabi, ochmasdan mazmunini ro'yxat qiladi.
mkdir extracted-zip
unzip project.zip -d extracted-zip

tar.gz va zip farqi

Xususiyat tar.gz zip
Unix ruxsatlari va egaligini saqlaydi Ha, to'liq Qisman, platformaga bog'liq
Windows’da qo'shimcha dasturisiz ochiladi Yo'q (qo'shimcha dastur kerak) Ha
Ichidagi bitta faylni hammasini qayta siqmasdan almashtirish Yo'q — butun arxivni qayta qurish kerak Ha, zip -u bilan
Linux ekotizimida odatiy standart Ha (zaxira nusxalar, paketlar, manba kodni tarqatish) Kamroq, asosan turli platformalar uchun

Linux serverlari o'rtasidagi zaxira nusxa va deploy uchun odatda tar.gz tanlanadi. Faylni tashqi foydalanuvchiga, ayniqsa Windows’dagi foydalanuvchiga yuborishda ko'pincha zip afzal ko'riladi.

rsync: inkremental sinxronlash

tar ham, zip ham har safar ishga tushganda bitta, to'liq nusxa (snapshot) yaratadi: 50 GB lik katalogdagi bitta o'zgargan faylni yangilash uchun qayta arxivlash baribir hammasini o'qib, qaytadan joylaydi. rsync boshqa muammoni hal qiladi: ikki katalog daraxtini (lokal yoki tarmoq orqali) faqat farqlarni uzatib, bir xil holatda saqlaydi.

sudo apt install rsync
mkdir -p ~/lab/archive/backup-target
rsync -avz project/ ~/lab/archive/backup-target/
  • -a (archive): "kataloglar ichiga kir va aniq nusxa uchun muhim bo'lgan deyarli hamma narsani saqla" degan qisqa shakl — ruxsatlar, egalik, vaqt tamg'alari, symbolic link’lar va qurilma fayllari. Aynan shu xususiyat rsync ni oddiy fayl nusxalash vositasi emas, zaxira nusxa vositasi qiladi.
  • -v: batafsil rejim, qaysi fayllar uzatilayotganini ko'rsatadi.
  • -z: uzatish paytida ma’lumotni siqadi (tarmoq orqali foydali, lokal diskda unchalik ahamiyatli emas).

Faqat bitta faylni o'zgartirib, xuddi shu buyruqni ikkinchi marta ishga tushirsangiz, tar dan farqi ko'rinadi:

echo 'level=WARN message=disk usage high' >> project/logs/app.log
rsync -avz project/ ~/lab/archive/backup-target/
sending incremental file list
project/logs/app.log

sent 1,234 bytes  received 35 bytes  ...

Faqat app.log qayta uzatildi. rsync ikki tomondagi fayl hajmi va o'zgartirilgan vaqtini (kerak bo'lsa, checksum algoritmi orqali fayl mazmunini ham) solishtiradi va faqat o'zgargan ma’lumotni yuboradi. rsync inkremental zaxira nusxa uchun standart vosita bo'lishining asosiy sababi shu: katta fayl tizimining tungi zaxira nusxasi birinchi ishga tushirishdan keyin har safar to'liq nusxalash o'rniga bir necha soniyada tugaydi.

Danger

rsync ning --delete bayrog'i manzildagi, manbada endi mavjud bo'lmagan fayllarni o'chiradi. Shu sabab manba yoki manzil yo'lidagi bitta xato zaxira ma’lumotlarini jimgina o'chirib yuborishi mumkin. Haqiqiy sinxronlashdan oldin u nima qilishini doim tekshiring:

rsync -avzn --delete project/ ~/lab/archive/backup-target/

-n (yoki --dry-run) hech narsaga tegmasdan aynan nima uzatilishi va nima o'chirilishini chiqaradi. -n ni faqat dry-run natijasi to'g'ri ko'ringandan keyin olib tashlang. Rollback uchun esa alohida, tekshirilgan arxivni (tar bilan yaratilgan yoki boshqa katalogga oldin bajarilgan rsync nusxasini) saqlab qo'ying.

Oxiridagi / belgisi muhim

rsync -avz project ~/lab/archive/backup-target/
rsync -avz project/ ~/lab/archive/backup-target/

Birinchi buyruq project katalogining o'zini manzilga nusxalaydi va natijada backup-target/project/... hosil bo'ladi. Ikkinchisi, ya’ni project dan keyin / qo'yilgani, project ning ichidagilarini to'g'ridan-to'g'ri manzilga nusxalaydi va qo'shimcha project/ darajasisiz backup-target/... hosil bo'ladi. Bu farq rsync dagi eng ko'p uchraydigan xatolardan birining manbai. Yangi manzilga birinchi marta sinxronlagandan keyin hosil bo'lgan yo'lni doim ls bilan tekshiring.

Zaxira nusxa uchun rsync va tar

Xususiyat tar/tar.gz rsync
Qayta ishga tushirilganda faqat o'zgargan ma’lumotni uzatadi Yo'q — butun arxivni qayta quradi Ha — asosiy vazifasi shu
Bitta ko'chma arxiv fayli yaratadi Ha Yo'q — katalog daraxtining aynan nusxasini yaratadi
"Ma’lum vaqtdagi holatni ko'chirish yoki saqlash uchun nusxa" vazifasiga mos Ha Unchalik to'g'ridan-to'g'ri emas (--link-dest bilan taxminan amalga oshirish mumkin)
"Zaxira katalogini doim yangilab turish" vazifasiga mos Yo'q — har safar butun ishni takrorlaydi Ha
To'g'ridan-to'g'ri tarmoq orqali ishlaydi (user@host:/path) Faqat ssh bilan qo'lda birlashtirilganda Ha, o'zida bor

Amalda ko'plab production zaxira strategiyalari ikkalasidan ham foydalanadi: ma’lumotni zaxira serveri yoki diskiga samarali ko'chirib turish uchun rsync, boshqa joyga yuborilishi yoki sanasi bilan saqlanishi kerak bo'lgan bitta mustaqil arxiv fayli uchun esa tar/tar.gz.

Amaliy vaziyat: log katalogini arxivlash, tekshirish va olib tashlash

Muammo: project/logs ni zaxira nusxa sifatida siqish, arxiv buzilmaganini tasdiqlash va shundan keyingina 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 butunligini tekshiring:

gzip -t "$archive" && echo "gzip integrity OK"
tar -tzf "$archive" > /dev/null && echo "tar structure OK"
  • gzip -t siqilgan faylning butunligini (buzilgan-buzilmaganini) tekshiradi.
  • tar -tzf ... > /dev/null arxivning ichki tuzilmasini boshidan oxirigacha o'qiydi va xato bo'lsa, noldan farqli holat qaytaradi.

Asl fayllarni faqat ikkala tekshiruv ham muvaffaqiyatli o'tgandan keyin o'chiring:

if gzip -t "$archive" && tar -tzf "$archive" > /dev/null; then
    echo "archive verified: $archive"
else
    echo "archive is corrupted, original files kept" >&2
    exit 1
fi

Danger

Arxivlagandan keyin asl fayllarni avtomatik o'chiradigan har qanday skriptda arxiv butunligini tekshirish ixtiyoriy emas, majburiy qadam. Disk to'lib qolishi yoki jarayon uzilib qolishi yarim yozilgan arxiv qoldirishi mumkin. Skript uni "muvaffaqiyatli yaratildi" deb hisoblaydi, asl ma’lumotlar esa allaqachon o'chirilgan bo'ladi.

Keng tarqalgan xatolar

  • tar o'zi siqadi deb o'ylash. Aslida doim -z kabi alohida bayroq (yoki mustaqil siqish vositasi) kerak.
  • -f dan keyin boshqa bayroqni yozish (masalan, tar -fcv). -f dan keyin darhol fayl nomi kelishi shart.
  • Ishonchsiz arxivni avval -tvf yoki unzip -l bilan ko'rib chiqmasdan, to'g'ridan-to'g'ri ochish.
  • gzip file.log asl faylni saqlab qoladi deb o'ylash. -k bo'lmasa, asl fayl siqilgan nusxa bilan almashtiriladi.
  • Zaxira skriptida arxiv butunligini tekshirmasdan asl fayllarni o'chirish.
  • Windows foydalanuvchisiga hech qanday izohsiz .tar.gz yuborish. Qo'shimcha dasturisiz uni ochish qiyinroq bo'lishi mumkin; bunday holatda zip mosroq.

Mashqlar

  1. project katalogini tar -czvf bilan siqing va uning hajmini siqilmagan tar -cvf arxivi hajmi bilan solishtiring.
  2. Hosil bo'lgan project.tar.gz ni ochmasdan -tzf bilan tekshiring, so'ng undan faqat project/logs/app.log ni ajratib oling.
  3. gzip -k -1 va gzip -k -9 yaratgan fayllar hajmini solishtiring va farqni tushuntiring.
  4. project ni zip -r bilan arxivlang, unzip -l bilan ko'rib chiqing, so'ng uning hajmini tar.gz varianti bilan solishtiring.
  5. Yuqoridagi amaliy vaziyatdagi arxivning nusxasini ataylab buzing (masalan, oxirgi baytlarini kesib tashlang) va tekshiruv skripti muammoni to'g'ri aniqlashini tasdiqlang.

Mashqni bajardim deyish uchun: har bir arxiv uchun uni ochishdan oldin mazmunini qanday tekshirganingizni va nima uchun aynan shu formatni (tar.gz yoki zip) tanlaganingizni tushuntirib bera olishingiz kerak.

Manbalar

  • GNU tar qo'llanmasi: https://www.gnu.org/software/tar/manual/tar.html
  • GNU tar: o'rnatilgan siqish: https://www.gnu.org/software/tar/manual/html_node/gzip.html
  • GNU Gzip qo'llanmasi: https://www.gnu.org/software/gzip/manual/gzip.html
  • zip va unzip uchun Info-ZIP hujjatlari: https://infozip.sourceforge.net/
  • POSIX: tar: https://pubs.opengroup.org/onlinepubs/9799919799/utilities/tar.html
  • rsync qo'llanmasi: https://download.samba.org/pub/rsync/rsync.1