Gentoo негізін салушыдан Linux-тың негіздері сабақтары. 1-бөлім (3/4): Сілтемелер, файлдар және папкаларды өшіру


Бұл бөлімшеде қатаң және символдық сілтемелер қарастырылған, сонымен бірге rm және rmdir командалары арқылы файлдарды және папкаларды жою талданған.

Бұл мақала аударма, түпнұсқасы мына жерде орналасқан.



Сілтемелерді құру және файлдарды жою


Қатаң сілтемелер

Біз «сілтеме» түсінігімен, папкалар мен инодтар арасындағы қатынасты айтқан кезде кездескен едік. Негізі, Linux-та сілтеменің екі түрі бар. Біз осыған дейін айтқан сілтемелердің түрі "қатаң сілтемелер" деп аталады. Әрбір инодқа саны шектелмеген қатаң сілтемелер болуы мүмкін. Файл ең соңғы қатаң сілтеме жойылған кезде және оны ешқандай бағдарлама ашық ұстап тұрған болмаса, онда Linux бұл файлды автоматты түрде дисктен жояды. Ал жаңа қатаң сілтемелерді ln командасы арқала құруға болады:

$ cd /tmp
$ touch firstlink
$ ln firstlink secondlink
$ ls -i firstlink secondlink
  15782 firstlink    15782 secondlink

Көріп тұрғанымыздай, қатаң сілтемелер инодтар деңгейінде жұмыс істейді. Linux жүйелерінде қатаң сілтемелерге деген бірнеше шектеулер бар. Атап айтқанда, қатаң сілтемелерді тек қана файлдарға құруға болады, папкаларға қатаң сілтеме құру рұқсат етілмеген. Қатаң сілтемелердің шектеулерінің тағы біреуі: қатаң сілтемелер арқылы бірнеше файлдық жүйелерді байланыстыруға болмайды. Яғни, сіз /usr/bin/bash файлынан /bin/bash файлына қатаң сілтеме құра алмайсыз, егер / және /usr папкалары әр түрлі файлдық жүйелерде жатқан болса.

Символдық сілтемелер

Практикада қатаң сілтемелерден гөрі символдық (кейде «симлинктер») сілтемелер көбірек қолданылады. Симлинктер — файлдарға инод номері арқылы емес, тікелей файлдың аты арқылы сілтемеленетін файлдардың ерекше бір түрі. Олар файлды жойылуыдан құтқармайды; егер симлинк көрсетіп тұрған файл жоғалса (жойылса, орын ауыстырса, атын өзгертсе), онда симлинк жұмыс жасамайды, бұзылады.

Символдық сілтемелерді ln командасына -s кілтін беру арқылы құруға болады:

$ ln -s secondlink thirdlink
$ ls -l firstlink secondlink thirdlink
-rw-rw-r--    2 agriffis agriffis        0 Dec 31 19:08 firstlink
-rw-rw-r--    2 agriffis agriffis        0 Dec 31 19:08 secondlink
lrwxrwxrwx    1 agriffis agriffis       10 Dec 31 19:39 thirdlink -> secondlink

ls -l командасының көмегімен символдық сілтемелерді үш түрлі әдіспен анықтауға болады. Біріншіден, бірінші бағандағы l символына назар аударыңыз. Екіншіден, символдық сілтеменің өлшемі ол көрсетіп тұрған файл атындағы символдар санына тең (біздің мысалымызда secondlink, 10 символ). Үшіншіден, соңғы колонкада "->" белгісі арқылы сілтеменің қайда көрсетіп тұрғаны көрсетіледі.

Симлинктер туралы толығырақ

Символдық сілтемелер қатаң сілтемелерге қарағанда қолайлы және көп жағдайда икемді. Символдық сілтемені файлдық жүйедегі кез-келген объектіге құра аласыз, сонымен бірге папкаларға да. Олардың негізінде файлдардың жолдары (инодтар емес) алынғандықтан басқа файлдық жүйеде орналасқан объектіге сілтемені еркін құруға болады. Бірақ, бұл мүмкіндіктер оларды түсінуді қиындатады.

Бізге, /tmp папкасынан /usr/local/bin папкасына сілтеме жасау керек болсын. Онда біз келесідей командалар орындаймыз:

$ cd /tmp
$ ln -s /usr/local/bin bin1
$ ls -l bin1
lrwxrwxrwx    1 root     root           14 Jan  1 15:42 bin1 -> /usr/local/bin

Немесе альтернативті нұсқа:

$ cd /tmp	
$ ln -s ../usr/local/bin bin2
$ ls -l bin2
lrwxrwxrwx    1 root     root           16 Jan  1 15:43 bin2 -> ../usr/local/bin

Көріп отырғанымыздай, екі символдық сілтемелер де бір папканы көрсетіп тұр. Бірақ, біздің екінші сілтемеміз басқа папкаға орын ауыстырғанда, салыстырмалы жол пайдаланылғандықтан, бұзылуы мүмкін:

$ ls -l bin2
lrwxrwxrwx    1 root     root           16 Jan  1 15:43 bin2 -> ../usr/local/bin



$ mkdir mynewdir
$ mv bin2 mynewdir
$ cd mynewdir
$ cd bin2
bash: cd: bin2: No such file or directory

Өйткені, /tmp/usr/local/bin папкасы жоқ, біз енді bin2 папкасына өте алмаймыз, басқаша айтқанда, bin2 сілтемесі бұзылған.

Сондықтан, салыстырмалы жолды символдық сілтемелерді жасамауға әрекет жасау қажет. Сонда да, салыстырмалы жолды символдық сілтемелер өте пайдалы болатын көп жағдайлар бар. Мысалыға, /usr/bin папкасындағы бір бағдарламаға альтернативті ат құру керек болсын. Суперпайдаланушы атынан біз keychain бағдарламасына альтернативті атты келесі түрде құра аламыз:

# cd /usr/bin
# ln -s /usr/bin/keychain kc
# ls -l keychain
-rwxr-xr-x    1 root     root        10150 Dec 12 20:09 /usr/bin/keychain

# ls -l kc 
lrwxrwxrwx    1 root     root           17 Mar 27 17:44 kc -> /usr/bin/keychain

Бұл мысалда /usr/bin/keychain файлына бағытталған kc атты символдық сілтемесін құрдық.

Бұл шешім жақсы жұмыс жасайды, бірақ біз /usr/bin/keychain және /usr/bin/kc екеуін де /usr/local/bin папкасына орынын ауыстыруды қаласақ, кейбір қолайсыздықтар туындайды:

# mv /usr/bin/keychain /usr/bin/kc /usr/local/bin
# ls -l /usr/local/bin/keychain
-rwxr-xr-x    1 root     root        10150 Dec 12 20:09 /usr/local/bin/keychain

# ls -l /usr/local/bin/kc
lrwxrwxrwx    1 root     root           17 Mar 27 17:44 kc -> /usr/bin/keychain

Біз kc символдық сілтемесіне абсолютті жолды пайдаланғандықтан ол әлі де /usr/bin/keychain жолын көрсетіп тұр. Бірақ, соңғы аталған файл жоқ, өйткені, біз оны /usr/bin/keychain орнынан /usr/local/bin папкасына ауыстырғанбыз.

Бұл, kc сілтемесінің бұзылуына алып келді. Салыстырмалы жолды және абсолютті жолды символдық сілтемелердің артықшылықтары мен кемшіліктері бар. Қажетті жағдайға байланысты сәйкес жол түрін пайдалану керек. Көбінесе, абсолютті де салыстырмалы да жолдар жақсы жұмыс жасайды. Төменде келтірілген мысал екі файлдың орнын ауыстырсақ та жұмыс жасайды (сілтемелер бұзылмайды):

# cd /usr/bin
# ln -s keychain kc
# ls -l kc
lrwxrwxrwx    1 root     root            8 Jan  5 12:40 kc -> keychain

# mv keychain kc /usr/local/bin
# ls -l /usr/local/bin/keychain
-rwxr-xr-x    1 root     root        10150 Dec 12 20:09 /usr/local/bin/keychain

# ls -l /usr/local/bin/kc
lrwxrwxrwx    1 root     root           17 Mar 27 17:44 kc -> keychain

Енді біз keychain бағдарламасын /usr/local/bin/kc арқылы орындай аламыз. /usr/local/bin/kc осы kc жатқан папкада орналасқан keychain бағдарламасына бағытталған сілтеме.

rm

Сонымен, біз cp, mv және ln командаларын білеміз, енді файлдық жүйеден объектілерді қалай жоюға болатынын қарастырайық. Әдетте, бұл rm командасының көмегімен жасалады. Файлдарды жою үшін, оларды жай ғана командалық жолақта көрсетіңіз:

$ cd /tmp
$ touch file1 file2
$ ls -l file1 file2
-rw-r--r--    1 root     root            0 Jan  1 16:41 file1
-rw-r--r--    1 root     root            0 Jan  1 16:41 file2

$ rm file1 file2
$ ls -l file1 file2
ls: file1: No such file or directory
ls: file2: No such file or directory

Келесі жағдайды есте сақтаңыз, Linux-та жойылған файл мәңгілікке жойылады. Сондықтан, бастауыш администраторлар файлдарды жойғанда -i кілтін пайдаланады. -i кілті rm командасына файлдарды интерактивті режимде жою керектігін айтады, яғни, кез-келген файлды жояр алдында пайдаланушыдан келісім сұрау. Мысалы:

$ rm -i file1 file2
rm: remove regular empty file `file1'? y
rm: remove regular empty file `file2'? y

Жоғарыдағы мысалда rm әр файлды жояр алдында келісім сұрайды. Келіскен жағдайда, мен «y» символын енгізіп enter батырмасын басуым керек, екі рет. Егер мен «n» символын енгізгенімде, файл жойылмайтын еді. Немесе, егер мен бір нәрсені қате жасасам Control-C батырмасын басуыма болады, ол rm -i командасының орындалуынан әйтеуір бір әрекет жасалудан алдын шығып кетеді.

Егер сіз rm командасын пайдалануды енді үйреніп жатқан болсаңыз, өзіңіздің сүйікті мәтіндік редакторыңыз арқылы ~/.bashrc файлына келесі қатарды енгізіңіз:

alias rm="rm -i"

Содан соң, командалық жолақтан шығыңыз (logout) және жүйеге қайта кіріңіз (login). Енді осыдан соң, сіз әр rm командасын орындаған кезде, ол автоматты түрде rm -i командасына айналады. Осылай, rm командасы әрдайым интерактивті режимде орындалады.

rmdir

Сізде папкаларды жоюдың екі түрлі әдісі бар. Сіз папканың ішіндегі барлық файлдарды жойып шығып, папканың өзі үшін rmdir командасын падалануыңызға болады:

$ mkdir mydir
$ touch mydir/file1
$ rm mydir/file1
$ rmdir mydir

Бұл әдіс «ақымақтар үшін папканы жою әдісі» атпен танымал. Көптеген мықты жігіттер және осы жұмыста ит жұтқан админдер төменде қарастырылатын rm -rf ыңғайлы командасын пайдаланады.

Папканы жоюдың ең жақсы әдісі rm командасының «рекурсивті күштеу» (recursive force) кілттерін пайдалану болады. Ол кілттер rm командасына көрсетілген папканы, және оның ішіндегі объектілерді рекурсивті түрде жою керектігін айтады:
$ rm -rf mydir

Әдетте, rm -rf папкалар ағашын жою үшін ыңғайлы. Бірақ, оны пайдаланған кезде өте абай болыңыз, өйткені, оның күші екі жақты пайдаланылуы мүмкін: жақсылық немесе жамандық. =)

  • +1
0 пікір
Тек тіркелген қолданушылар ғана пікір қалдыра алады.