رفتن به محتوا
LoopX

آرشیو و فشرده‌سازی

توی این درس یاد می‌گیری برای بکاپ‌گرفتن یا فرستادن چند فایل، اول همه را در یک فایل (آرشیو) جمع می‌کنی و بعد فشرده می‌کنی. tar فایل‌ها را در یک بسته می‌گذارد؛ gzip (و bzip2 و xz) آن بسته را فشرده می‌کند؛ و zip هر دو کار را با هم و در قالبی که ویندوز و مک هم باز می‌کنند انجام می‌دهد. با tar -czf backup.tar.gz dir می‌سازی، با tar -tzf بدون باز کردن محتوا را می‌بینی، با tar -xzf باز می‌کنی، با zip -r و unzip هم همین را برای zip؛ و نام بکاپ را با تاریخ می‌نویسی. تمرین: از پوشه‌ی یک پروژه بکاپ فشرده با تاریخ در اسم فایل بگیر.

مسئله: چند هزار فایل، یک کار

Section titled “مسئله: چند هزار فایل، یک کار”

کپی‌کردن یک پوشه‌ی هزار فایلی از راه شبکه یعنی هزار بار شروع و پایان؛ کند و پرخطا. همه‌ی آن‌ها را در یک فایل بگذاری، هم انتقال سریع‌تر می‌شود، هم دسترسی‌ها و زمان‌ها حفظ می‌شود، و اگر فشرده هم کنی، حجم کمتر می‌شود. این همان کاری است که هر بکاپ و هر انتشار نرم‌افزار می‌کند.

تشبیه: جعبه‌ی اسباب‌کشی

Section titled “تشبیه: جعبه‌ی اسباب‌کشی”

tar مثل ریختن همه‌چیز در یک کارتن است (با یک فهرست از محتوا)؛ کارتن خودش جا را کم نمی‌کند. gzip مثل کیسه‌ی وکیوم است که هوای اضافی را بیرون می‌دهد. .tar.gz یعنی «کارتن، داخل کیسه‌ی وکیوم». و zip کارتنی است که از اول وکیوم‌شده ساخته می‌شود و در هر کشوری (ویندوز، مک، لینوکس) باز می‌شود.

نام .tar.gz خودش مراحل را می‌گوید: tar فایل‌ها را در یک بسته جمع می‌کند و gzip آن بسته‌ی یکپارچه را فشرده می‌کند. باز کردن، همین دو مرحله به‌صورت برعکس است.

یک «پروژه‌ی نمونه» می‌سازم که همه‌ی انواع محتوا را دارد: کد (قابل‌فشرده‌شدن)، یک فایل متنی بزرگ و تکراری، یک فایل تصادفی (که فشرده نمی‌شود)، یک پوشه‌ی node_modules و یک لاگ (که در بکاپ نمی‌خواهیمشان)، و یک فایل با اسم فارسی:

Terminal window
mkdir -p arc/proj/src arc/proj/docs arc/proj/node_modules/lib arc/proj/logs
cd arc
for i in $(seq 1 200); do echo "line $i: the quick brown fox jumps over the lazy dog"; done > proj/src/app.js
head -c 300000 /dev/zero | tr '\0' 'a' > proj/docs/big.txt
head -c 50000 /dev/urandom > proj/docs/random.bin
echo "x" > proj/node_modules/lib/index.js
echo "log" > proj/logs/app.log
echo "سلام" > proj/docs/فارسی.txt
du -sh proj
خروجی
396K proj

مثال ۱: ساختن، دیدن و باز کردن، tar -czf، -tzf، -xzf

Section titled “مثال ۱: ساختن، دیدن و باز کردن، tar -czf، -tzf، -xzf”
Terminal window
cd arc
echo "--- ساختن (c = create، z = gzip، f = فایل خروجی):"
tar -czf backup.tar.gz proj
ls -l backup.tar.gz | awk '{print "حجم آرشیو:", $5, "بایت"}'
echo "--- دیدن محتوا بدون باز کردن (t = list):"
tar -tzf backup.tar.gz
echo "--- جزئیات (v = verbose: دسترسی، مالک، حجم، تاریخ):"
tar -tvzf backup.tar.gz | head -4
خروجی
--- ساختن (c = create، z = gzip، f = فایل خروجی):
حجم آرشیو: 52472 بایت
--- دیدن محتوا بدون باز کردن (t = list):
proj/
proj/node_modules/
proj/node_modules/lib/
proj/node_modules/lib/index.js
proj/docs/
proj/docs/فارسی.txt
proj/docs/random.bin
proj/docs/big.txt
proj/logs/
proj/logs/app.log
proj/src/
proj/src/app.js
--- جزئیات (v = verbose: دسترسی، مالک، حجم، تاریخ):
drwxr-xr-x ali/ali 0 2026-10-04 07:22 proj/
drwxr-xr-x ali/ali 0 2026-10-04 07:22 proj/node_modules/
drwxr-xr-x ali/ali 0 2026-10-04 07:22 proj/node_modules/lib/
-rw-r--r-- ali/ali 2 2026-10-04 07:22 proj/node_modules/lib/index.js

حجم از حدود ۳۹۶ کیلوبایت به حدود ۵۱ کیلوبایت رسید؛ چرا همه‌چیز فشرده نشد؟ چون فایل تصادفی (۵۰ کیلوبایت) را نمی‌شود فشرده کرد (مثال ۴). حالا باز کردن (x = extract). -C مقصد را تعیین می‌کند (پوشه باید از قبل باشد) و با diff -r ثابت می‌کنم دقیقاً همان است:

Terminal window
cd arc
mkdir restore
tar -xzf backup.tar.gz -C restore
ls restore/proj
diff -r proj restore/proj && echo "محتوا دقیقاً یکی است"
خروجی
docs
logs
node_modules
src
محتوا دقیقاً یکی است

tar فلگ‌هایش را می‌شود پشت سر هم و بدون خط‌تیره (یا با آن) نوشت. یک «جمله»ی قابل‌یادآوری: -czf = create gzip file، -xzf = extract gzip file، -tzf = list gzip file.

فلگ معنی
c ساختن آرشیو (create)
x باز کردن (extract)
t فقط فهرست محتوا (list)
f نام فایل آرشیو؛ باید آخرین فلگ باشد و اسم فایل فوراً بعد از آن بیاید
z با gzip (.tar.gz)
j با bzip2 (.tar.bz2)
J با xz (.tar.xz)
v پرحرف: نام فایل‌ها را چاپ کن
C dir قبل از کار به این پوشه برو (برای باز کردن در مقصد)
--exclude=الگو فایل‌هایی را که با الگو می‌خوانند نگذار
p دسترسی‌ها را همان‌طور نگه دار (برای root پیش‌فرض است)

برای tar -x لازم نیست نوع فشرده‌سازی را بنویسی: tar -xf backup.tar.gz هم خودکار از روی فایل تشخیص می‌دهد. ولی برای ساختن باید بگویی.

مثال ۳: بکاپ با تاریخ در اسم فایل (تمرین اصلی)

Section titled “مثال ۳: بکاپ با تاریخ در اسم فایل (تمرین اصلی)”

نام بکاپ باید تاریخ داشته باشد تا بدانی کدام قدیمی‌تر است. date +%F تاریخ را به شکل 2026-10-04 می‌دهد و $(...) آن را در اسم فایل می‌گذارد. ضمناً چیزهایی که در بکاپ نمی‌خواهی (node_modules، لاگ‌ها) را با --exclude کنار می‌گذارم:

Terminal window
cd arc
name="backup-$(date +%F).tar.gz"
tar -czf "$name" --exclude=node_modules --exclude='*.log' proj
echo "بکاپ: $name"
ls -l "$name" | awk '{print $5, $9}'
echo "--- محتوای آن (node_modules و لاگ نیست):"
tar -tzf "$name"
echo "--- سالم است؟ (فقط خواندن تا آخر؛ بدون خروجی یعنی سالم)"
gzip -t "$name" && echo "سالم"
خروجی
بکاپ: backup-2026-10-04.tar.gz
52384 backup-2026-10-04.tar.gz
--- محتوای آن (node_modules و لاگ نیست):
proj/
proj/docs/
proj/docs/فارسی.txt
proj/docs/random.bin
proj/docs/big.txt
proj/logs/
proj/src/
proj/src/app.js
--- سالم است؟ (فقط خواندن تا آخر؛ بدون خروجی یعنی سالم)
سالم

قبل از اینکه به بکاپ اعتماد کنی، آزمایشش کن: tar -tzf (یا gzip -t) نشان می‌دهد آرشیو کامل و قابل‌خواندن است، و یک بار هم بازیابی را امتحان کن (مثال ۱). بکاپی که هرگز بازیابی نشده، فقط یک فایل امیدوارکننده است.

⚡ بررسی سریع

کدام دستور محتوای یک آرشیو tar.gz را بدون باز کردنش نشان می‌دهد؟

مثال ۴: gzip، bzip2، xz و فایل‌هایی که فشرده نمی‌شوند

Section titled “مثال ۴: gzip، bzip2، xz و فایل‌هایی که فشرده نمی‌شوند”

فرمت‌های مختلف تعادل متفاوتی بین حجم و سرعت دارند: gzip سریع و معمولی، bzip2 کندتر و کوچک‌تر، xz کندترین و کوچک‌ترین. برای مقایسه‌ی منصفانه از یک مجموعه‌ی متنی واقعی (پوشه‌ی مجوزهای سیستم) استفاده می‌کنم، و برای مقایسه با داده‌ی غیرقابل‌فشرده یک فایل تصادفی:

Terminal window
cd arc
cp -r /usr/share/common-licenses corpus
tar -cf corpus.tar corpus
for c in "gzip -k" "bzip2 -k" "xz -k"; do $c corpus.tar; done
echo "--- متن واقعی: (حجم بایت، فایل)"
ls -l corpus.tar corpus.tar.gz corpus.tar.bz2 corpus.tar.xz | awk '{print $5, $9}'
echo "--- داده‌ی تصادفی (مثل عکس JPEG یا فایل zip که قبلاً فشرده است):"
head -c 100000 /dev/urandom > random.dat
gzip -k random.dat
ls -l random.dat random.dat.gz | awk '{print $5, $9}'
خروجی
--- متن واقعی: (حجم بایت، فایل)
256000 corpus.tar
46970 corpus.tar.bz2
66908 corpus.tar.gz
44172 corpus.tar.xz
--- داده‌ی تصادفی (مثل عکس JPEG یا فایل zip که قبلاً فشرده است):
100000 random.dat
100049 random.dat.gz

متن از ۲۵۶ کیلوبایت به حدود ۶۷ (gzip)، ۴۷ (bzip2) و ۴۴ (xz) کیلوبایت رسید؛ هرچه کندتر، کوچک‌تر. ولی داده‌ی تصادفی با فشرده‌سازی کوچک نشد و حتی کمی بزرگ‌تر هم شد، چون الگوی تکراری ندارد. فایل‌هایی که از قبل فشرده‌اند (JPEG، MP4، zip، .gz) را دوباره فشرده نکن؛ فقط وقت تلف می‌کند. قاعده‌ی عمل: gzip پیش‌فرض (سریع و همه‌جا)، xz برای چیزی که یک بار فشرده و بارها دانلود می‌شود (مثل بسته‌های نرم‌افزار).

مثال ۵: gzip روی یک فایل، فایل اصلی را عوض می‌کند!

Section titled “مثال ۵: gzip روی یک فایل، فایل اصلی را عوض می‌کند!”

برخلاف tar که فایل‌ها را کپی می‌کند، gzip فایل را جایگزین می‌کند:

Terminal window
cd arc
echo "سلام دنیا" > f.txt
echo "--- gzip f.txt (فایل اصلی دیگر نیست):"
gzip f.txt
ls f.txt*
echo "--- gzip -l: حجم فشرده در برابر اصلی (یک فایل کوچک بزرگ‌تر هم می‌شود!):"
gzip -l f.txt.gz
echo "--- zcat: خواندن بدون باز کردن:"
zcat f.txt.gz
echo "--- gunzip -k: باز کردن و نگه‌داشتن فایل فشرده (-k = keep):"
gunzip -k f.txt.gz
ls f.txt*
خروجی
--- gzip f.txt (فایل اصلی دیگر نیست):
f.txt.gz
--- gzip -l: حجم فشرده در برابر اصلی (یک فایل کوچک بزرگ‌تر هم می‌شود!):
compressed uncompressed ratio uncompressed_name
45 18 -16.7% f.txt
--- zcat: خواندن بدون باز کردن:
سلام دنیا
--- gunzip -k: باز کردن و نگه‌داشتن فایل فشرده (-k = keep):
f.txt
f.txt.gz

gzip -k (و gunzip -k) هر دو فایل را نگه می‌دارد. zcat و zless متن فایل فشرده را بدون باز کردنش نشان می‌دهند. و gzip -l نشان داد فایل ۱۸ بایتی بعد از فشرده شدن ۴۵ بایت شد، یعنی از اصلی بزرگ‌تر: سربار قالب فشرده برای فایل‌های بسیار کوچک بیشتر از سودش است.

zip برای وقتی است که گیرنده ممکن است ویندوز یا مک داشته باشد (همه‌ی سیستم‌ها بدون نصب چیزی باز می‌کنند). zip -r بازگشتی می‌گیرد و -x الگوها را کنار می‌گذارد:

Terminal window
cd arc
zip -r proj.zip proj -x 'proj/node_modules/*' | tail -3
echo "--- محتوا (unzip -l):"
unzip -l proj.zip | tail -6
echo "--- باز کردن در یک پوشه‌ی مشخص (-d):"
mkdir uz
unzip -q proj.zip -d uz
ls uz/proj
خروجی
adding: proj/logs/app.log (stored 0%)
adding: proj/src/ (stored 0%)
adding: proj/src/app.js (deflated 95%)
--- محتوا (unzip -l):
0 2026-10-04 07:22 proj/logs/
4 2026-10-04 07:22 proj/logs/app.log
0 2026-10-04 07:22 proj/src/
10692 2026-10-04 07:22 proj/src/app.js
--------- -------
360705 9 files
--- باز کردن در یک پوشه‌ی مشخص (-d):
docs
logs
src

zip خروجی deflated 95% (فشرده‌شده) یا stored 0% (ذخیره‌شده بدون فشرده‌سازی، مثل پوشه‌ها) را برای هر فایل می‌گوید. فرق عملی با tar.gz: zip هر فایل را جدا فشرده می‌کند (دسترسی به یک فایل بدون باز کردن بقیه سریع است ولی فشرده‌سازی کلی ضعیف‌تر)، و دسترسی‌های یونیکسی (مالک، گروه) را کامل نگه نمی‌دارد؛ برای بکاپ سیستم لینوکسی tar بهتر است.

مثال ۷: بازیابی انتخابی و --strip-components

Section titled “مثال ۷: بازیابی انتخابی و --strip-components”

لازم نیست برای یک فایل کل آرشیو باز شود. اسم فایل داخل آرشیو را بنویس. با -O هم می‌توانی محتوا را فقط روی صفحه بیاوری، بدون ساختن فایل. و --strip-components=1 بالاترین پوشه‌ی داخل آرشیو (proj/) را کنار می‌گذارد:

Terminal window
cd arc
echo "--- فقط یک فایل از آرشیو را روی صفحه (-O):"
tar -xzf backup-*.tar.gz proj/src/app.js -O | head -2
echo "--- جستجو در فهرست آرشیو بدون باز کردن:"
tar -tzf backup-*.tar.gz | grep 'docs/'
echo "--- بدون پوشه‌ی بالایی (--strip-components=1):"
mkdir stripped
tar -xzf backup-*.tar.gz -C stripped --strip-components=1
ls stripped
خروجی
--- فقط یک فایل از آرشیو را روی صفحه (-O):
line 1: the quick brown fox jumps over the lazy dog
line 2: the quick brown fox jumps over the lazy dog
--- جستجو در فهرست آرشیو بدون باز کردن:
proj/docs/
proj/docs/فارسی.txt
proj/docs/random.bin
proj/docs/big.txt
--- بدون پوشه‌ی بالایی (--strip-components=1):
docs
logs
src

پشت پرده: tar چطور بسته‌بندی می‌کند؟

Section titled “پشت پرده: tar چطور بسته‌بندی می‌کند؟”

tar از tape archive می‌آید؛ برای نوارهای مغناطیسی ساخته شد و هنوز از همان طرح بلوک‌بندی استفاده می‌کند: هر فایل یک سرآیند ۵۱۲ بایتی (نام، دسترسی، مالک، حجم، زمان) و سپس محتوا (که به مضرب ۵۱۲ بایت پر می‌شود) دارد، و آرشیو را معمولاً تا مضرب ۱۰۲۴۰ بایت (۲۰ بلوک) پر می‌کند. به همین دلیل یک فایل کوچک هم آرشیو ده‌کیلوبایتی می‌دهد:

Terminal window
cd arc
echo a > tiny.txt
tar -cf tiny.tar tiny.txt
echo "حجم آرشیو یک فایل ۲ بایتی: $(stat -c %s tiny.tar) بایت"
echo "--- file نوع فایل را از روی محتوا می‌شناسد:"
file backup-*.tar.gz corpus.tar | cut -c1-100
echo "--- .tar.gz دو لایه است: gzip بیرون، tar داخل:"
gzip -dc backup-*.tar.gz | file - | cut -c1-60
خروجی
حجم آرشیو یک فایل ۲ بایتی: 10240 بایت
--- file نوع فایل را از روی محتوا می‌شناسد:
backup-2026-10-04.tar.gz: gzip compressed data, from Unix, original size modulo 2^32 368640
corpus.tar: POSIX tar archive (GNU)
--- .tar.gz دو لایه است: gzip بیرون، tar داخل:
/dev/stdin: POSIX tar archive (GNU)

پس .tar.gz یک فایل tar است که با gzip فشرده شده؛ می‌توانی لایه‌ها را جدا هم بسازی (tar -cf سپس gzip) یا یکجا (tar -czf). tar برای اینکه ترتیب و متادیتا را حفظ کند، فشرده‌سازی را روی کل جریان انجام می‌دهد؛ برای همین نسبت فشرده‌سازی tar.gz معمولاً از zip (که تک‌تک فایل‌ها را فشرده می‌کند) بهتر است، و دسترسی تصادفی به یک فایل وسط آرشیو کندتر.

دستور کار
tar -czf backup.tar.gz dir ساختن آرشیو فشرده‌ی gzip
tar -tzf backup.tar.gz فهرست محتوا
tar -xzf backup.tar.gz -C مقصد باز کردن در مقصد
tar -xzf a.tar.gz مسیر/داخل/آرشیو بازیابی یک فایل
tar -czf a.tar.gz --exclude=node_modules dir با کنار گذاشتن
tar -cjf / tar -cJf bzip2 / xz
gzip -k فایل / gunzip -k فایل.gz فشرده / باز، با نگه‌داشتن اصلی
zcat فایل.gz خواندن بدون باز کردن
gzip -t فایل.gz آزمایش سلامت
zip -r a.zip dir -x 'dir/tmp/*' ساختن zip
unzip -l a.zip / unzip a.zip -d مقصد فهرست / باز کردن
فرمت سرعت حجم کاربرد
gzip (.gz) سریع متوسط پیش‌فرض، بکاپ روزانه، وب
bzip2 (.bz2) کندتر کوچک‌تر کمتر رایج امروز
xz (.xz) کند کوچک‌ترین یک بار فشرده، بارها دانلود (بسته‌های نرم‌افزار)
zip متوسط متوسط تبادل با ویندوز/مک

۱) ترتیب فلگ‌ها: f باید آخر باشد

Section titled “۱) ترتیب فلگ‌ها: f باید آخر باشد”
Terminal window
cd arc
tar -cfz wrong.tar.gz proj
echo "--- و فایلی که اشتباهاً ساخته شد:"
ls -l z
rm -f z
خروجی
tar: wrong.tar.gz: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors
--- و فایلی که اشتباهاً ساخته شد:
-rw-r--r-- 1 ali ali 378880 Oct 4 07:22 z

f فلگی است که اسم بعدی را به‌عنوان نام آرشیو می‌گیرد. در -cfz، حرف z بعد از f آمد، پس tar آرشیو را با نام z ساخت (بدون فشرده‌سازی) و wrong.tar.gz و proj را دو ورودی دید: proj داخل آرشیوی به اسم z رفت و برای wrong.tar.gz (که وجود ندارد) خطا داد. نتیجه: یک فایل عجیب به اسم z و آرشیوی که فکر می‌کردی ساخته‌ای وجود ندارد. راه‌حل: f همیشه آخر و اسم آرشیو فوراً بعدش: tar -czf wrong.tar.gz proj.

Terminal window
cd arc
tar -czf abs.tar.gz /home/ali/arc/proj/src 2>&1
tar -tzf abs.tar.gz | head -2
خروجی
tar: Removing leading `/' from member names
home/ali/arc/proj/src/
home/ali/arc/proj/src/app.js

tar مسیرهای مطلق را با حذف / ابتدایی ذخیره کرد (هشدار، نه خطا) تا هنگام باز کردن، فایل‌ها ناگهان روی /home/... سیستم ننشینند. راه‌حل: این رفتار درست است؛ بهتر است از ابتدا مسیر نسبی بدهی یا با -C بسازی تا آرشیو تمیز باشد: tar -czf abs.tar.gz -C /home/ali/arc proj/src.

۳) tarbomb: آرشیو بدون پوشه‌ی بالایی

Section titled “۳) tarbomb: آرشیو بدون پوشه‌ی بالایی”
Terminal window
cd arc
tar -czf bomb.tar.gz -C proj .
mkdir work && echo "گزارش" > work/report.txt
cd work
echo "--- قبل از باز کردن:"
ls
tar -xzf ../bomb.tar.gz
echo "--- بعد (فایل‌ها قاطی شدند!):"
ls
خروجی
--- قبل از باز کردن:
report.txt
--- بعد (فایل‌ها قاطی شدند!):
docs
logs
node_modules
report.txt
src

آرشیو بدون یک پوشه‌ی بالایی ساخته شده بود (با -C proj .)، پس محتوایش مستقیم داخل پوشه‌ی جاری ریخته شد و با فایل‌های خودت قاطی شد (و فایل هم‌نام را بی‌خبر رونویسی می‌کرد). راه‌حل: قبل از باز کردن یک آرشیو ناشناس tar -tzf آرشیو | head را بزن؛ و همیشه در پوشه‌ی تازه باز کن (tar -xzf a.tar.gz -C پوشه‌ی-تازه). آرشیو خودت را هم بدون پوشه‌ی بالایی نساز.

۴) tar -x فایل‌های موجود را بی‌صدا رونویسی می‌کند

Section titled “۴) tar -x فایل‌های موجود را بی‌صدا رونویسی می‌کند”
Terminal window
cd arc
echo "نسخه‌ی تازه‌ی من" > restore/proj/src/app.js
tar -xzf backup-*.tar.gz -C restore
head -1 restore/proj/src/app.js
echo "--- با -k (--keep-old-files): رونویسی نکن"
echo "نسخه‌ی تازه‌ی من" > restore/proj/src/app.js
tar -xzkf backup-*.tar.gz -C restore 2>&1 | head -2
head -1 restore/proj/src/app.js
خروجی
line 1: the quick brown fox jumps over the lazy dog
--- با -k (--keep-old-files): رونویسی نکن
tar: proj/docs/فارسی.txt: Cannot open: File exists
tar: proj/docs/random.bin: Cannot open: File exists
نسخه‌ی تازه‌ی من

بازیابی روی پوشه‌ی موجود، تغییرات تازه‌ی تو را با نسخه‌ی بکاپ بی‌اخطار عوض کرد. با -k رونویسی نمی‌کند (و خطای «File exists» می‌دهد). راه‌حل: بازیابی را در یک پوشه‌ی تازه انجام بده و بعد دستی ادغام کن.

۵) فشرده‌کردن چیزی که قبلاً فشرده است، یا پاک‌کردن مبدأ قبل از آزمایش

Section titled “۵) فشرده‌کردن چیزی که قبلاً فشرده است، یا پاک‌کردن مبدأ قبل از آزمایش”

مثال ۴: فایل‌های تصادفی/فشرده کوچک‌تر نمی‌شوند. و هرگز پوشه‌ی اصلی را پیش از آزمایش بکاپ (tar -tzf، بازیابی) پاک نکن.

✎ تمرینآسان

آرشیو backup-*.tar.gz را فهرست کن و بشمار چند فایل (نه پوشه) دارد. (راهنمایی: خط‌هایی که با / تمام نمی‌شوند.)

دیدن جواب
Terminal window
cd arc
tar -tzf backup-*.tar.gz | grep -vc '/$'
tar -tzf backup-*.tar.gz | grep -v '/$'
خروجی
4
proj/docs/فارسی.txt
proj/docs/random.bin
proj/docs/big.txt
proj/src/app.js
✎ تمرینمتوسط

تمرین اصلی: از پوشه‌ی یک پروژه بکاپ فشرده با تاریخ در اسم فایل بگیر. ~/arc/proj را با نام proj-تاریخ-ساعت.tar.gz (با date +%F_%H%M) بکاپ بگیر، node_modules را کنار بگذار، سلامت را بررسی کن، در یک پوشه‌ی تازه بازیابی کن و با diff -r ثابت کن (بدون node_modules) یکی است.

دیدن جواب
Terminal window
cd arc
f="proj-$(date +%F_%H%M).tar.gz"
tar -czf "$f" --exclude=node_modules proj
echo "ساخته شد: $f ($(stat -c %s "$f") بایت)"
tar -tzf "$f" > /dev/null && echo "آرشیو قابل‌خواندن است"
mkdir -p verify && tar -xzf "$f" -C verify
diff -r --exclude=node_modules proj verify/proj && echo "بازیابی دقیقاً یکی است"
خروجی
ساخته شد: proj-2026-10-04_0722.tar.gz (52424 بایت)
آرشیو قابل‌خواندن است
بازیابی دقیقاً یکی است
✎ تمرینسخت

چرخش بکاپ: فقط ۳ بکاپ آخر را نگه دار. پنج بکاپ با تاریخ‌های مختلف بساز (backup-2026-10-01.tar.gz تا -05)، سپس با ls -1t و tail -n +4 و xargs rm قدیمی‌ترین‌ها را پاک کن.

دیدن جواب
Terminal window
mkdir -p rot && cd rot
for d in 01 02 03 04 05; do
tar -czf "backup-2026-10-$d.tar.gz" -C ../arc proj/src
touch -d "2026-10-$d 02:00" "backup-2026-10-$d.tar.gz"
done
echo "--- قبل (جدیدترین بالا):"
ls -1t backup-*.tar.gz
echo "--- پاک‌کردن همه به‌جز ۳ تای جدید (tail -n +4 از خط چهارم به بعد):"
ls -1t backup-*.tar.gz | tail -n +4 | xargs rm -v
echo "--- بعد:"
ls -1t backup-*.tar.gz
خروجی
--- قبل (جدیدترین بالا):
backup-2026-10-05.tar.gz
backup-2026-10-04.tar.gz
backup-2026-10-03.tar.gz
backup-2026-10-02.tar.gz
backup-2026-10-01.tar.gz
--- پاک‌کردن همه به‌جز ۳ تای جدید (tail -n +4 از خط چهارم به بعد):
removed 'backup-2026-10-02.tar.gz'
removed 'backup-2026-10-01.tar.gz'
--- بعد:
backup-2026-10-05.tar.gz
backup-2026-10-04.tar.gz
backup-2026-10-03.tar.gz
؟ آزمونک
  1. تفاوت tar و gzip؟

  2. کدام دستور بکاپ فشرده‌ی پوشه‌ی site با تاریخ در نام می‌سازد؟

  3. چرا tar -cfz a.tar.gz dir اشتباه است؟

  4. قبل از باز کردن یک آرشیو ناشناس چه می‌زنی و چرا؟

  5. gzip فایل f.txt را اجرا کردی. چه شد؟

  6. چرا فشرده‌کردن یک عکس JPEG یا یک فایل zip فایده‌ای ندارد؟

  • tar چند فایل را در یک آرشیو جمع می‌کند؛ با z (gzip)، j (bzip2) یا J (xz) فشرده می‌شود. tar -czf a.tar.gz dir بساز، tar -tzf ببین، tar -xzf a.tar.gz -C مقصد باز کن. فلگ f آخر و اسم فایل فوراً بعدش.
  • بکاپ خوب: نام با تاریخ ($(date +%F))، --exclude برای چیزهای غیرلازم، آزمایش (tar -tzf، gzip -t، و یک بار بازیابی) و چرخش (نگه‌داشتن چند نسخه‌ی آخر).
  • gzip فایل را جایگزین می‌کند (-k برای نگه‌داشتن)؛ zcat بدون باز کردن می‌خواند؛ xz کوچک‌تر ولی کندتر؛ داده‌ی فشرده یا تصادفی کوچک نمی‌شود.
  • zip -r / unzip برای تبادل با ویندوز و مک؛ برای بکاپ لینوکسی tar بهتر (دسترسی‌ها و مالک را حفظ می‌کند).
  • مراقب باش: tarbomb (آرشیو بدون پوشه‌ی بالایی؛ قبل از باز کردن tar -tzf | head)، رونویسی بی‌صدا هنگام باز کردن (-k)، و پاک‌نکردن مبدأ قبل از آزمایش بکاپ.
برگه‌ی تقلب این درس
دستورکاری که می‌کند
tar -czf backup.tar.gz dirساختن آرشیو فشرده
tar -tzf backup.tar.gzفهرست محتوا
tar -xzf backup.tar.gz -C مقصدباز کردن در مقصد
tar -xzf a.tar.gz مسیر/فایل -Oیک فایل روی صفحه
tar -czf "b-$(date +%F).tar.gz" --exclude=node_modules dirبکاپ با تاریخ و exclude
tar -xzf a.tar.gz --strip-components=1بدون پوشه‌ی بالایی
gzip -k فایل / gunzip -k فایل.gzبا نگه‌داشتن اصلی
zcat فایل.gz / gzip -t فایل.gzخواندن / آزمایش سلامت
zip -r a.zip dir -x "dir/tmp/*"ساختن zip
unzip -l a.zip / unzip a.zip -d مقصدفهرست / باز کردن
ls -1t backup-*.tar.gz | tail -n +4 | xargs rmنگه‌داشتن ۳ بکاپ آخر