Mashqlar — fayl tizimi bilan ishlash
Muammodan boshlaylik
Buyruqlarni o'qish — bir narsa, barmoqlar ularni o'zi yozishi — boshqa. Bu darsda 1–10-darslardagi hamma narsani amalda qo'llaysiz. Har bir mashqni avval o'zingiz bajaring, keyin yechimni oching.
Xavfsiz o'yin maydoni yarating:
mkdir -p ~/mashq && cd ~/mashq
Hamma mashqlar shu papka ichida — biror narsa buzilsa, rm -rf ~/mashq va qaytadan.
1-mashq: Orientatsiya
- Qaysi papkada ekaningizni chiqaring
- Uy papkangizdagi barcha fayllarni, yashirinlari bilan, batafsil ko'ring
/etcdagi.confbilan tugaydigan fayllar ro'yxati- Tizimning distributivi va versiyasini bilib oling
bashdasturi qayerda joylashgan?
Yechim
pwd
ls -la ~
ls /etc/*.conf
cat /etc/os-release
which bash # yoki: type bash
2-mashq: Loyiha skeleti
Bitta (yoki ikkita) buyruq bilan shu tuzilmani yarating:
~/mashq/blog/
├── README.md
├── public/
│ ├── css/style.css
│ ├── js/main.js
│ └── index.html
└── src/
├── posts/
└── templates/
├── header.html
└── footer.html
Yechim
mkdir -p ~/mashq/blog/{public/{css,js},src/{posts,templates}}
cd ~/mashq/blog
touch README.md public/index.html public/css/style.css public/js/main.js \
src/templates/{header,footer}.html
tree # yoki: find . | sort
3-mashq: Postlar
src/posts da post-1.md dan post-20.md gacha 20 ta fayl yarating. Keyin:
- 1 dan 9 gacha bo'lgan postlarni (bir xonali) ro'yxatlang
post-1,post-10...post-19larni ro'yxatlang- Barcha postlarni
src/posts/arxiv/ga ko'chiring
Yechim
cd ~/mashq/blog/src/posts
touch post-{1..20}.md
ls post-?.md # bitta belgi — 1..9
ls post-1*.md # post-1, post-10..post-19
mkdir arxiv
mv post-*.md arxiv/
ls arxiv | wc -l # 20
4-mashq: Nusxa va nom o'zgartirish
public/index.htmlga<h1>Salom</h1>yozing- Uning
index.backup.htmlnusxasini yarating style.cssning nominiasosiy.cssga o'zgartiring- Butun
publicpapkaningpublic-v1nomli nusxasini yarating, vaqt va ruxsatlarni saqlab
Yechim
cd ~/mashq/blog
echo "<h1>Salom</h1>" > public/index.html
cp public/index.html public/index.backup.html
mv public/css/style.css public/css/asosiy.css
cp -a public public-v1
ls -R public-v1
5-mashq: Qidirish
Avval tayyorlang:
cd ~/mashq
mkdir -p loglar
for i in $(seq 1 5); do echo "log $i" > loglar/app-$i.log; done
touch -d "10 days ago" loglar/app-1.log loglar/app-2.log
head -c 2M /dev/urandom > loglar/katta.bin
Endi find bilan:
~/mashqdagi barcha.logfayllar- 1 MB dan katta fayllar
- 7 kundan eski
.logfayllar - Bo'sh fayllar (2-mashqdan qolganlari)
- 7 kundan eski loglarni o'chiring (avval ro'yxatni tekshirib)
Yechim
find ~/mashq -name "*.log"
find ~/mashq -type f -size +1M
find ~/mashq -name "*.log" -mtime +7
find ~/mashq -type f -empty
find ~/mashq -name "*.log" -mtime +7 # avval tekshirish
find ~/mashq -name "*.log" -mtime +7 -delete # keyin o'chirish
ls loglar
touch -d "10 days ago" — fayl vaqtini sun'iy o'zgartirish; sinov uchun qulay.
6-mashq: Log fayllarni o'qish
Sinov log faylini yarating:
cd ~/mashq
for i in $(seq 1 1000); do echo "$(date +%T) qator $i"; done > katta.log
- Faylda nechta qator bor?
- Birinchi 5 qatorni ko'rsating
- Oxirgi 3 qatorni ko'rsating
- 500-qatorni ko'rsating (
headvatailbirgalikda) - Ikkinchi terminalda
tail -f katta.logni ishga tushiring, birinchisidaecho "yangi qator" >> katta.log— nima bo'ladi?
Yechim
wc -l katta.log # 1000
head -n 5 katta.log
tail -n 3 katta.log
head -n 500 katta.log | tail -n 1 # 500-qator
sed -n '500p' katta.log # yoki shunday (16-dars)
5: tail -f yangi qatorni darhol ko'rsatadi. Ctrl+C bilan to'xtating.
7-mashq: Versiyalar va havolalar
Deploy sxemasini simulyatsiya qiling:
~/mashq/ilova/
├── releases/
│ ├── v1/index.html ("Versiya 1")
│ └── v2/index.html ("Versiya 2")
└── current -> releases/v1
- Tuzilmani yarating
cat ~/mashq/ilova/current/index.html— "Versiya 1"currentniv2ga almashtiring — "Versiya 2"- Orqaga
v1ga qayting v1papkani o'chiring —currentga nima bo'ldi? Buzilgan havolalarni topib ko'ring.
Yechim
mkdir -p ~/mashq/ilova/releases/{v1,v2}
cd ~/mashq/ilova
echo "Versiya 1" > releases/v1/index.html
echo "Versiya 2" > releases/v2/index.html
ln -s releases/v1 current
cat current/index.html # Versiya 1
ln -sfn releases/v2 current
cat current/index.html # Versiya 2
ln -sfn releases/v1 current
ls -l current # current -> releases/v1
rm -r releases/v1
cat current/index.html # No such file or directory
find . -xtype l # ./current
Nisbiy havola (releases/v1) — current turgan papkadan hisoblanadi, shuning uchun butun ilova papkasini ko'chirsangiz ham ishlaydi.
8-mashq: Tozalash
Faqat bitta buyruq bilan ~/mashq dagi barcha bo'sh fayllarni o'chiring, keyin bo'sh qolgan papkalarni. Oxirida esa butun ~/mashq ni o'chiring — lekin avval qayerda turganingizni tekshiring.
Yechim
find ~/mashq -type f -empty -delete
find ~/mashq -type d -empty -delete
cd ~
pwd # /home/ism — mashq ichida emasmiz
ls ~/mashq # nima o'chishini ko'rish
rm -rf ~/mashq
Nima uchun shunday?
Nima uchun bu mashqlarda "avval tekshir, keyin o'chir" qayta-qayta takrorlanadi?
Chunki terminal ishining eng qimmat xatolari — bitta noto'g'ri rm yoki -delete. Tajribali administratorlar ham aynan shu odat bilan himoyalanadi: avval ko'r (ls, find harakatsiz, pwd), keyin bajar. Bu sekinlik emas — bu bir soniyalik tekshiruv evaziga soatlab tiklash ishidan qutulish. Mashqlarda bu odat barmoqlaringizga o'rnashsin — production serverda u sizni qutqaradi.
Xulosa
Siz mashq qildingiz:
pwd,ls -la,cat,which— orientatsiyamkdir -p+{}— tuzilmalarni tez yaratishtouch,cp -a,mv— fayllar bilan ishlash- Glob naqshlar:
?,*,{1..20} find— nom, hajm, vaqt, bo'sh;-delete— tekshiruvdan keyinhead,tail,wc -l,tail -f- Symlink lar bilan versiyalarni almashtirish
Keyingi bo'lim
3-bo'lim: Matn bilan ishlash — muharrirlar, pipe, grep, sed, awk.