Skip to content

Fayl va katalog buyruqlari

Server boshqaruvida oddiy fayl amallari juda ko'p uchraydi: log katalogini tekshirish, konfiguratsiya faylidan nusxa olish, yangi relizni kerakli joyga ko'chirish yoki vaqtinchalik fayllarni o'chirish. Xavf odatda buyruqning murakkabligida emas. Asosiy xavf — to'g'ri buyruqni noto'g'ri katalogda, noto'g'ri yo'lga yoki kutilganidan ko'proq o'zgarish qiladigan parametrlar bilan bajarishdir.

Ushbu qismda mashqlarni faqat ~/lab/file-commands katalogi ichida bajaring. Shell va Bash qanday ishlaydi hamda Buyruq sintaksisi va yordam hujjatlari qismlaridagi tushunchalar — qo'shtirnoqlar, type, yo'llar va chiqish holati tushunchalari sizga tanish bo'lishi kerak.

Xavfsiz laboratoriya muhitini tayyorlash

mkdir -p ~/lab/file-commands
cd ~/lab/file-commands
pwd

Kutiladigan natija:

/home/<username>/lab/file-commands

<username> o'rniga amalda sizning foydalanuvchi nomingiz chiqadi. Ushbu mashqlar uchun sudo kerak emas. Agar sudo ishlatsangiz, uy katalogingiz ichida root foydalanuvchisiga tegishli fayllar yaratilishi va keyinchalik laboratoriya katalogini tozalash qiyinlashishi mumkin.

Yo'llar va kataloglar bo'ylab harakatlanish

Mutlaq yo'l / katalogidan boshlanadi:

ls -ld /var/log

Nisbiy yo'l esa joriy ish katalogidan boshlanadi:

cd /var
ls -ld log

Ikkala yo'l ham bir xil obyektni ko'rsatishi mumkin. Lekin nisbiy yo'lning ma'nosi jarayon ayni vaqtda qaysi katalogda turganiga bog'liq.

Kataloglar bo'ylab harakatlanishda foydali buyruqlar:

pwd
cd /var/log
pwd
cd -
pwd
cd ~/lab/file-commands

cd - oldingi ish katalogiga qaytaradi. Bu cd .. bilan bir xil emas. cd .. joriy katalogning ota katalogiga o'tadi.

Ko'p ishlatiladigan yo'l belgilari:

  • . — joriy katalogni bildiradi.
  • .. — ota katalogni bildiradi.
  • ~ — Bash tomonidan foydalanuvchining uy katalogiga almashtiriladi.
  • / — kataloglarni ajratish belgisi va fayl tizimining ildiz katalogi.

Linux serverlarida keng tarqalgan fayl tizimlarida fayl nomlari katta-kichik harflarga sezgir. Shu sababli Reports, reports va REPORTS uchta alohida nom bo'lishi mumkin.

Fayllar ro'yxatini ko'rish va ularni tekshirish

Quyidagi buyruqlardan boshlang:

ls
ls -lah
ls -ld .

ls -lah quyidagi parametrlarni anglatadi:

  • -l — batafsil ro'yxat ko'rinishi.
  • -a — nomi . bilan boshlanadigan yashirin fayllarni ham ko'rsatish.
  • -h — batafsil ro'yxatda fayl hajmlarini inson o'qishi qulay ko'rinishda chiqarish.

ls -ld . joriy katalog ichidagi fayllarni emas, katalogning o'zini ko'rsatadi.

Batafsil ro'yxat namunasi:

drwxr-xr-x 3 admin admin 4096 Jul 29 10:20 .
-rw-r--r-- 1 admin admin   24 Jul 29 10:21 app.conf

Natijani chapdan o'ngga qarab quyidagicha o'qing:

  • Birinchi belgi — obyekt turi. Masalan, d katalogni, - esa oddiy faylni bildiradi.
  • Ruxsat bitlari — egasi, guruhi va boshqa foydalanuvchilarning huquqlari.
  • Havolalar soni.
  • Fayl egasi va guruhi.
  • Fayl hajmi.
  • Oxirgi o'zgartirilgan vaqt.
  • Fayl yoki katalog nomi.

Havolalar soni faylning nechta nusxasi borligini emas, bir xil inode obyektiga nechta katalog yozuvi, ya'ni nom, ishora qilayotganini ko'rsatadi.

Hech qachon hard link yaratilmagan oddiy faylda bu qiymat 1 bo'ladi.

Bo'sh katalogda esa havolalar soni 2 dan boshlanadi:

  • birinchi yozuv — ota katalogdagi katalog nomi;
  • ikkinchi yozuv — katalog ichidagi . yozuvi bo'lib, u yana shu katalogning o'ziga ishora qiladi.

Har bir ichki katalog havolalar sonini bittaga oshiradi. Sababi, ichki katalogdagi .. yozuvi ota katalogga ishora qiladi:

mkdir -p project/count-demo/child
stat -c 'links=%h name=%n' project/count-demo
links=3 name=project/count-demo

count-demo katalogida havolalar soni 3 bo'ldi:

  • ota katalogdagi count-demo nomi;
  • katalog ichidagi .;
  • child katalogi ichidagi ...

Oddiy faylda havolalar soni 1 dan katta bo'lsa, bir nechta fayl nomi aynan bir xil ma'lumotga ishora qilayotganini anglatadi. Bu mavzu quyidagi Hard link va symbolic link farqi bo'limida tushuntiriladi.

Ranglar fayllarni ajratishda qulay, lekin ular ishonchli manba emas. Ranglar aliaslar va LS_COLORS sozlamasiga bog'liq.

Aniqroq tekshirish uchun:

file /etc/hosts
stat /etc/hosts

file fayl tarkibining turini aniqlashga harakat qiladi. stat esa inode, egasi, ruxsat rejimi, hajmi va vaqt belgilari kabi metadata ma'lumotlarini ko'rsatadi.

Yashirin fayllar

Nomi . bilan boshlanadigan fayllar oddiy ls natijasida ko'rinmaydi:

touch .env.example
ls
ls -A

ls -A yashirin nomlarni ko'rsatadi, lekin nazarda tutiladigan . va .. yozuvlarini chiqarmaydi.

Yashirin fayllar maxsus xavfsizlik qoidalari bilan himoyalanmaydi. Ular faqat nomlash qoidasi tufayli oddiy ro'yxatda ko'rinmaydi.

Fayl va kataloglar yaratish

Kichik loyiha tuzilmasini yarating:

mkdir -p project/{config,logs,backup}
touch project/config/app.conf
find project -maxdepth 2 -print

Kutiladigan tuzilma:

project
project/config
project/config/app.conf
project/logs
project/backup

mkdir -p mavjud bo'lmagan ota kataloglarni ham yaratadi. Belgilangan katalog avvaldan mavjud bo'lsa, xatolik bilan tugamaydi.

{config,logs,backup} qismi Bash brace expansion hisoblanadi. mkdir ishga tushishidan oldin Bash bu yozuvni uchta alohida argumentga aylantiradi.

touch fayl mavjud bo'lmasa, bo'sh fayl yaratadi. Fayl avvaldan mavjud bo'lsa, odatda uning vaqt belgilarini yangilaydi.

Faylga ma'lumot yozing:

printf 'port=8080\n' > project/config/app.conf
printf 'mode=lab\n' >> project/config/app.conf
cat project/config/app.conf

Natija:

port=8080
mode=lab

Warning

> belgisi buyruq yangi ma'lumot yozishidan oldin mavjud fayl tarkibini tozalaydi. Laboratoriyada bu foydali bo'lishi mumkin, lekin production konfiguratsiya fayllarida xavflidir. Muhim fayllarda qayta yo'naltirishdan oldin zaxira nusxa yarating va nishon faylni tekshiring.

Bo'sh katalogni o'chiring:

mkdir project/empty
rmdir project/empty
test ! -e project/empty && echo "empty directory removed"

rmdir ichi bo'sh bo'lmagan katalogni o'chirishdan bosh tortadi. Bu cheklov xavfsizlik xususiyati hisoblanadi.

cp yordamida nusxa olish

Ko'p ishlatiladigan shakllar:

cp [OPTION]... SOURCE DEST
cp [OPTION]... SOURCE... DIRECTORY

Fayldan nusxa oling va natijani tekshiring:

cp -i project/config/app.conf project/backup/app.conf
cmp project/config/app.conf project/backup/app.conf
echo "cmp status=$?"

Agar cmp hech qanday natija chiqarmasa va 0 holat kodini qaytarsa, ikki fayl baytma-bayt bir xil bo'ladi.

Butun katalog tuzilmasidan nusxa oling:

cp -a project/config project/backup/config-snapshot
find project/backup -maxdepth 3 -print

GNU cp -a archive rejimini bildiradi. U katalogni rekursiv nusxalaydi va imkon qadar fayl xususiyatlarini saqlab qoladi.

cp -r ham rekursiv nusxalaydi, lekin u atributlarni saqlash maqsadini cp -a kabi aniq bildirmaydi.

Nishon katalog bilan bog'liq qoidalar muhim:

mkdir source existing-directory
touch source/file.txt
cp -a source new-name
cp -a source existing-directory/
find . -maxdepth 3 -print

Agar new-name mavjud bo'lmasa, u source katalogining nusxasiga aylanadi.

Agar nishon avvaldan mavjud katalog bo'lsa, source shu katalog ichiga nusxalanadi.

Mavjud bo'lishi mumkin bo'lgan yo'lga nusxa olishdan oldin quyidagicha tekshiring:

ls -ld -- <path>

mv yordamida ko'chirish va nomini o'zgartirish

Fayl nomini o'zgartiring:

mv -i project/backup/app.conf project/backup/app.conf.old
test -f project/backup/app.conf.old && echo "new name exists"
test ! -e project/backup/app.conf && echo "old name is gone"

mv bitta katalog ichida fayl nomini o'zgartirishi yoki uni boshqa katalogga ko'chirishi mumkin.

Agar nishon fayl mavjud bo'lsa, mv uni almashtirib yuborishi mumkin. -i parametri almashtirishdan oldin tasdiq so'raydi.

Bitta fayl tizimi ichida nom o'zgartirish odatda tez va atomar bajariladi.

Turli fayl tizimlari orasida esa mv ko'proq nusxa olish va keyin asl faylni o'chirish kabi ishlaydi.

Katta hajmdagi ma'lumotni ko'chirishdan oldin bo'sh disk joyi, jarayonning uzilib qolishi va ortga qaytarish imkoniyatini hisobga oling.

cp ma'lumotning ikkinchi, mustaqil nusxasini yaratadi.

Link esa bir xil ma'lumotga boshqa nom orqali murojaat qilish imkonini beradi. Linuxda xatti-harakati turlicha bo'lgan ikki xil link mavjud.

Hard link — bir xil inode obyektiga ishora qiladigan ikkinchi katalog yozuvidir:

printf 'v1\n' > project/config/app.conf
ln project/config/app.conf project/config/app.conf.hardlink
stat -c 'links=%h inode=%i name=%n' project/config/app.conf project/config/app.conf.hardlink
links=2 inode=... name=project/config/app.conf
links=2 inode=... name=project/config/app.conf.hardlink

Endi ikkala nom bir xil inode raqamini va 2 havola sonini ko'rsatadi.

Nomlarning istalgan biri orqali yozilgan ma'lumot aynan bir xil asosiy ma'lumotni o'zgartiradi:

printf 'v2\n' > project/config/app.conf
cat project/config/app.conf.hardlink
v2

Nomlardan bittasini o'chirish faqat shu katalog yozuvini olib tashlaydi.

Havolalar soni 0 ga tushmaguncha ma'lumot qolgan nom orqali mavjud bo'ladi.

Shu sababli qat'iy ma'noda rm “faylni o'chiradi” deyilmaydi. U fayl nomini olib tashlaydi.

Asosiy ma'lumot faqat oxirgi link va faylni ochiq holda ushlab turgan barcha jarayonlar yo'qolgandan keyin bo'shatiladi.

Symbolic link esa boshqa turdagi obyekt. U ichida yo'l saqlanadigan kichik fayl bo'lib, har safar undan foydalanilganda Linux yadrosi shu yo'lni qayta aniqlaydi:

ln -s app.conf project/config/app.conf.symlink
ls -l project/config/app.conf.symlink
stat -c 'links=%h inode=%i name=%n' project/config/app.conf.symlink
lrwxrwxrwx 1 admin admin 9 Jul 29 10:22 project/config/app.conf.symlink -> app.conf
links=1 inode=... name=project/config/app.conf.symlink

ls -l natijasining boshidagi l belgisi va -> orqali ko'rsatilgan nishon bu obyekt oddiy fayl emas, symlink ekanini bildiradi.

Symlinkning o'z inode raqami va havolalar soni nishon faylnikidan alohida bo'ladi.

Amaliyotda, suhbatlarda yoki production muhitida muhim bo'ladigan asosiy farqlar:

  • Nishon faylni o'chirish. app.conf faylini o'chirsangiz, app.conf.hardlink ishlashda davom etadi. U “nishon” emas, balki aynan bir xil ma'lumotning teng huquqli ikkinchi nomidir. app.conf.symlink esa uzilgan, ya'ni dangling link holatiga tushadi. ls uni ko'rsatadi, lekin ochishga uringanda No such file or directory xatosi chiqadi.
  • Fayl tizimlari orasida ishlash. Hard link faqat aynan bir fayl tizimidagi inode obyektiga ishora qilishi mumkin. Sababi inode raqamlari faqat bitta fayl tizimi doirasida noyob bo'ladi. ln turli fayl tizimlari orasida hard link yaratishni rad etadi. Symlink esa shunchaki saqlangan yo'l matni bo'lgani uchun istalgan joyga, boshqa fayl tizimiga yoki hali mavjud bo'lmagan yo'lga ham ishora qilishi mumkin.
  • Kataloglar. Linuxda katalog uchun hard link yaratib bo'lmaydi. Bu katalog daraxtida sikllar paydo bo'lishining oldini olish uchun taqiqlangan. Katalogga symlink yaratish esa mumkin.
  • rm nimani bilishi kerak. Oddiy rm symlink-name buyrug'i faqat symlinkning o'zini o'chiradi, nishon faylni emas. Katalogga ishora qiladigan symlink oxiriga / qo'shish yoki uni katalogning o'zi kabi ishlatishga urinish ko'p chalkashliklarga sabab bo'ladi. Link bilan ishlaydigan skript yozishdan oldin quyidagilardan biri bilan tekshiring:
ls -l -- <path>
readlink -f -- <path>

Misol:

readlink project/config/app.conf.symlink
readlink -f project/config/app.conf.symlink
app.conf
/home/<username>/lab/file-commands/project/config/app.conf

readlink -f parametrsiz ishlatilsa, symlink ichida aynan qanday nishon matni saqlanganini ko'rsatadi.

readlink -f esa linkni kuzatib, uni to'liq mutlaq yo'lga aylantiradi.

Skript symlink ayni vaqtda qayerga ishora qilayotganini bilishi kerak bo'lsa, readlink -f kerak bo'ladi.

Bo'shliqli nomlar, wildcard va - bilan boshlanadigan nomlar

Ichida bo'shliq bo'lishi mumkin bo'lgan yo'llarni har doim qo'shtirnoq ichida yozing:

touch 'project/monthly report.txt'
ls -l -- 'project/monthly report.txt'

Fayl nomi - bilan boshlanishi mumkin bo'lsa, -- ishlating:

touch -- -draft
ls -l -- -draft

O'chirish kabi zararli amalni bajarishdan oldin wildcard qanday kengayishini oldindan ko'ring:

touch project/logs/app.log project/logs/error.log
echo project/logs/*.log

Buyruq ishga tushishidan oldin Bash *.log andozasini mos fayl nomlariga almashtiradi.

Hech qanday fayl mos kelmasa, Bashning standart sozlamalarida andoza o'z holicha qolishi mumkin.

Wildcard aynan siz kutgan fayllarga mos tushdi deb taxmin qilmang.

Fayllarni o'chirish

Laboratoriya faylini tasdiq so'raladigan rejimda o'chiring:

touch project/logs/test.log
ls -l -- project/logs/test.log
rm -i -- project/logs/test.log
test ! -e project/logs/test.log && echo "file removed"

Danger

Rekursiv o'chirish butun katalog daraxtini qayta tiklab bo'lmaydigan tarzda olib tashlashi mumkin. Katalogni o'chirishdan oldin to'liq yo'lni quyidagi buyruqlar bilan tekshiring:

pwd
printf '<%s>\n' "$target"
find "$target" -maxdepth 2 -print
Sinovdan o'tgan zaxira nusxa yoki snapshot va ortga qaytarish rejasi bo'lmasa, production serverda majburiy rekursiv o'chirishdan foydalanmang.

Laboratoriya katalogini avval tekshiring:

target="$HOME/lab/file-commands/project"
printf 'target=<%s>\n' "$target"
find "$target" -maxdepth 3 -print

Faqat nishon to'g'ri va laboratoriya ichida ekaniga ishonch hosil qilgandan keyin:

rm -rI -- "$target"
test ! -e "$target" && echo "lab project removed"

-r katalogni ichidagi barcha obyektlar bilan rekursiv o'chiradi.

GNU -I ko'p fayl o'chirilishidan oldin bir marta tasdiq so'raydi. U -i ga qaraganda kamroq savol beradi, lekin baribir zararli buyruq hisoblanadi.

Fayl amallaridagi odatiy xatolarni tushunish

Fayl buyruqlaridagi xatolarning aksariyati bir nechta keng tarqalgan xabarlardan biriga to'g'ri keladi.

Qaysi xatolik yuz berganini tanish muammoni aniqlashni ancha osonlashtiradi.

cat project/does-not-exist.conf
cat: project/does-not-exist.conf: No such file or directory

Bu yo'l umuman mavjud emas.

Quyidagilarni tekshiring:

  • yozishda xato yo'qligini;
  • noto'g'ri katalogda turmaganligingizni, avval pwd ni tekshiring;
  • oldingi qadam xato bilan tugab, siz buni sezmay qolmaganligingizni.
touch /etc/example-not-allowed.conf
touch: cannot touch '/etc/example-not-allowed.conf': Permission denied

Yo'l yoki uning ota katalogi mavjud, lekin joriy foydalanuvchining ruxsat bitlari, yoki o'rnatilgan bo'lsa ACL, bu amalni bajarishga ruxsat bermaydi.

Darhol sudo ishlatishdan oldin egalik va ruxsat rejimini tekshiring:

ls -ld -- <path>
stat -- <path>

Nima uchun ruxsat berilmayotganini tushunib oling. Har safar ruxsat tizimini chetlab o'tish uchun root huquqidan foydalanish ruxsat tizimining maqsadini yo'qqa chiqaradi.

cat project
cat: project: Is a directory

Buyruq fayl kutgan edi, lekin unga katalog berildi.

Bu ko'pincha nusxa ko'chirish vaqtida yoki fayl yo'lini saqlashi kerak bo'lgan o'zgaruvchi katalog yo'lini saqlab qolganida yuz beradi.

Oddiy fayl talab qiladigan buyruqni ishga tushirishdan oldin quyidagilar bilan tekshirish mumkin:

file -- <path>
test -f -- <path>
rmdir project
rmdir: failed to remove 'project': Directory not empty

rmdir ataylab faqat bo'sh kataloglarni o'chiradi.

Ichida fayllar mavjud katalog uchun rm -r yoki rm -rI kerak bo'ladi. Bunday buyruqni faqat find yordamida tarkibini oldindan ko'rgandan keyin ishlating.

Amaliy vaziyat: konfiguratsiya nusxasini xavfsiz yangilash

Muammo: asl konfiguratsiya faylini saqlab qolgan holda uning o'zgartirilgan nusxasini tayyorlash kerak.

Asl faylni yarating:

mkdir -p ~/lab/file-commands/scenario/{current,backup}
printf 'port=8080\nmode=production\n' > ~/lab/file-commands/scenario/current/app.conf

Zaxira nusxa yarating va tekshiring:

cp -a ~/lab/file-commands/scenario/current/app.conf \
      ~/lab/file-commands/scenario/backup/app.conf.before-change
cmp ~/lab/file-commands/scenario/current/app.conf \
    ~/lab/file-commands/scenario/backup/app.conf.before-change
echo "backup status=$?"

O'zgartirilgan nusxani tayyorlang:

cp -a ~/lab/file-commands/scenario/current/app.conf \
      ~/lab/file-commands/scenario/current/app.conf.new
printf 'port=9090\nmode=production\n' > ~/lab/file-commands/scenario/current/app.conf.new
cat ~/lab/file-commands/scenario/current/app.conf.new

Faqat tekshirgandan keyin faylni almashtiring:

mv -i ~/lab/file-commands/scenario/current/app.conf.new \
      ~/lab/file-commands/scenario/current/app.conf
cat ~/lab/file-commands/scenario/current/app.conf

Xulosa: bu ish tartibi zaxira nusxa olish, tahrirlash, tekshirish va almashtirish bosqichlarini bir-biridan ajratadi.

Haqiqiy production servislarida qayta yuklash yoki qayta ishga tushirishdan oldin dasturga xos konfiguratsiya tekshiruvi ham talab qilinadi.

Keng tarqalgan xatolar

  • Joriy katalog qayerdaligini bilmasdan fayl buyruqlarini bajarish.
  • Uy katalogidagi laboratoriyada sudo ishlatib, root foydalanuvchisiga tegishli fayllar yaratish.
  • cd - va cd .. buyruqlarini bir xil deb o'ylash.
  • Yashirin fayllar himoyalangan deb hisoblash. Ular faqat standart ro'yxatda ko'rinmaydi.
  • Nishon katalog mavjud yoki yo'qligini tekshirmasdan katalogdan nusxa olish.
  • Yo'llarni saqlaydigan o'zgaruvchilarni qo'shtirnoqsiz ishlatish.
  • Nishonni oldindan ko'rmasdan rekursiv o'chirish buyrug'ini bajarish.
  • Symlink va uning nishoni birga o'chiriladi yoki symlinkka rm ishlatilsa, u ko'rsatgan ma'lumot ham o'chadi deb hisoblash.
  • Permission denied xatosini ko'rib, egalik va ruxsatlarni ls -l yordamida tekshirmasdan darhol sudo ishlatish.

Mashqlar

  1. Bitta buyruq yordamida ~/lab/file-commands/ex1/{input,output,tmp} tuzilmasini yarating. Keyin find bilan tekshiring.
  2. Nomida bo'shliq mavjud fayl yarating. Qo'shtirnoqsiz yozilgan xato buyruqni va qo'shtirnoq bilan yozilgan to'g'ri buyruqni ko'rsating.
  3. Katalogdan cp -a yordamida nusxa oling, find bilan tekshiring, keyin nusxa nomini mv -i yordamida o'zgartiring.
  4. Uchta .log fayl yarating. Ulardan bittasini interaktiv tarzda o'chirishdan oldin wildcard kengayishini echo yordamida ko'ring.
  5. Bir xil faylga hard link va symbolic link yarating. Asl faylni o'chiring va har bir link uchun cat ishlatib, qaysi biri ishlashda davom etishini va qaysi biri dangling link bo'lib qolganini ko'rsating.
  6. Laboratoriyada ataylab No such file or directory, Permission denied va Is a directory xatolarini yuzaga keltiring. Har birini tuzatishdan oldin sababini bitta jumla bilan yozing.

Manbalar