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
-c: yangi arxiv yaratadi.-v: batafsil rejim (verbose), qaysi fayllar qo'shilayotganini ko'rsatadi.-f project.tar: arxiv fayli nomi. Bayroqlar birga yozilganda-foxirgi bo'lishi va undan keyin darhol fayl nomi kelishi kerak.
Ochmasdan ichini ko'rish
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
-x: arxivni ochadi (extract).-C extracted: arxivni joriy katalog o'rniga ko'rsatilgan katalogga ochadi.-Cbo'lmasa,taryo'llarni joriy katalogga nisbatan ochadi.
Bitta faylni ajratib olish
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
-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
-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:
app.log.copy endi mavjud emas: gzip uni siqib, o'rniga app.log.copy.gz ni qoldirdi. Asl faylni saqlab qolish uchun:
-k (keep — saqlash) asl faylni joyida qoldiradi.
Siqilgan faylni tiklash:
Siqilgan faylni diskka ochmasdan, mazmunini ko'rish:
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 |
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.
-r: katalogni ichidagilari bilan birga (rekursiv) qo'shadi.unzip -l:tar -tvfkabi, ochmasdan mazmunini ro'yxat qiladi.
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 xususiyatrsyncni 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/
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:
-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
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 -tsiqilgan faylning butunligini (buzilgan-buzilmaganini) tekshiradi.tar -tzf ... > /dev/nullarxivning 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
taro'zi siqadi deb o'ylash. Aslida doim-zkabi alohida bayroq (yoki mustaqil siqish vositasi) kerak.-fdan keyin boshqa bayroqni yozish (masalan,tar -fcv).-fdan keyin darhol fayl nomi kelishi shart.- Ishonchsiz arxivni avval
-tvfyokiunzip -lbilan ko'rib chiqmasdan, to'g'ridan-to'g'ri ochish. gzip file.logasl faylni saqlab qoladi deb o'ylash.-kbo'lmasa, asl fayl siqilgan nusxa bilan almashtiriladi.- Zaxira skriptida arxiv butunligini tekshirmasdan asl fayllarni o'chirish.
- Windows foydalanuvchisiga hech qanday izohsiz
.tar.gzyuborish. Qo'shimcha dasturisiz uni ochish qiyinroq bo'lishi mumkin; bunday holatdazipmosroq.
Mashqlar
projectkataloginitar -czvfbilan siqing va uning hajmini siqilmagantar -cvfarxivi hajmi bilan solishtiring.- Hosil bo'lgan
project.tar.gzni ochmasdan-tzfbilan tekshiring, so'ng undan faqatproject/logs/app.logni ajratib oling. gzip -k -1vagzip -k -9yaratgan fayllar hajmini solishtiring va farqni tushuntiring.projectnizip -rbilan arxivlang,unzip -lbilan ko'rib chiqing, so'ng uning hajminitar.gzvarianti bilan solishtiring.- 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
zipvaunzipuchun 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