Mashqlar — fayl tizimi bilan ishlash

~20 daq · Linux · Fayl tizimi

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

  1. Qaysi papkada ekaningizni chiqaring
  2. Uy papkangizdagi barcha fayllarni, yashirinlari bilan, batafsil ko'ring
  3. /etc dagi .conf bilan tugaydigan fayllar ro'yxati
  4. Tizimning distributivi va versiyasini bilib oling
  5. bash dasturi 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. 1 dan 9 gacha bo'lgan postlarni (bir xonali) ro'yxatlang
  2. post-1, post-10 ... post-19 larni ro'yxatlang
  3. 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

  1. public/index.html ga <h1>Salom</h1> yozing
  2. Uning index.backup.html nusxasini yarating
  3. style.css ning nomini asosiy.css ga o'zgartiring
  4. Butun public papkaning public-v1 nomli 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:

  1. ~/mashq dagi barcha .log fayllar
  2. 1 MB dan katta fayllar
  3. 7 kundan eski .log fayllar
  4. Bo'sh fayllar (2-mashqdan qolganlari)
  5. 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
  1. Faylda nechta qator bor?
  2. Birinchi 5 qatorni ko'rsating
  3. Oxirgi 3 qatorni ko'rsating
  4. 500-qatorni ko'rsating (head va tail birgalikda)
  5. Ikkinchi terminalda tail -f katta.log ni ishga tushiring, birinchisida echo "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
  1. Tuzilmani yarating
  2. cat ~/mashq/ilova/current/index.html — "Versiya 1"
  3. current ni v2 ga almashtiring — "Versiya 2"
  4. Orqaga v1 ga qayting
  5. v1 papkani o'chiring — current ga 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 — orientatsiya
  • mkdir -p + {} — tuzilmalarni tez yaratish
  • touch, cp -a, mv — fayllar bilan ishlash
  • Glob naqshlar: ?, *, {1..20}
  • find — nom, hajm, vaqt, bo'sh; -delete — tekshiruvdan keyin
  • head, tail, wc -l, tail -f
  • Symlink lar bilan versiyalarni almashtirish

Keyingi bo'lim

3-bo'lim: Matn bilan ishlash — muharrirlar, pipe, grep, sed, awk.