Skip to content

Упражнения_ _командите_в_Линукс

Alexander Todorov edited this page May 25, 2012 · 1 revision

Чрез упражненията в тази лекция читателят ще затвърди знанията за основните команди в Линукс и ще свикне да използва командния ред.

Table of Contents

Отпечатване списък на файловете в директория

Извеждането на списък с файлове е често срещана операция. Тя ни помага да разберем какво има в дадена директория и да разберем къде са данните с които искаме да работим. Използва се командата ls (list).

Задача: Да се изведе списък на файловете в домашната директория.

Решение: Използваме командата ls без никакви параметри (ако се намираме в домашната директория) или с параметър ~ (тилда).

 $ ls
 Desktop

или

 $ ls ~
 Desktop

Задача: Да се изведе форматиран списък на всички файлове в домашната директория.

Решение: Използваме ls -al. -a за да видим скритите файлове (започват с точка), -l за да видим форматиран списък.

 $ ls -la
 total 280
 drwx------ 23 student student 4096 Jan  1 18:04 .
 drwxr-xr-x  4 root    root    4096 Jan  1 11:08 ..
 drwx------  3 student student 4096 Jan  1 11:18 .adobe
 -rw-------  1 student student  323 Jan  1 14:26 .bash_history
 -rw-r--r--  1 student student   33 Jan  1 11:08 .bash_logout
 -rw-r--r--  1 student student  176 Jan  1 11:08 .bash_profile
 -rw-r--r--  1 student student  124 Jan  1 11:08 .bashrc
 drwx------  5 student student 4096 Jan  1 14:26 .config
 drwxr-xr-x  2 student student 4096 Jan  1 17:48 Desktop
 -rw-------  1 student student   26 Jan  1 11:12 .dmrc
 drwxr-x---  2 student student 4096 Jan  1 11:12 .eggcups
 -rw-r--r--  1 student student  515 Jan  1 11:08 .emacs
 -rw-------  1 student student   16 Jan  1 11:36 .esd_auth
 drwx------  4 student student 4096 Jan  1 17:48 .gconf
 drwx------  2 student student 4096 Jan  1 17:49 .gconfd
 drwxrwxr-x  3 student student 4096 Jan  1 11:12 .gnome
 drwx------  9 student student 4096 Jan  1 17:49 .gnome2
 drwx------  2 student student 4096 Jan  1 11:12 .gnome2_private
 drwxrwxr-x  2 student student 4096 Jan  1 11:12 .gstreamer-0.10
 -rw-r--r--  1 student student   89 Jan  1 11:12 .gtkrc-1.2-gnome2
 -rw-------  1 student student  161 Jan  1 17:48 .ICEauthority
 drwxrwxr-x  2 student student 4096 Jan  1 11:59 .icons
 drwxr-xr-x  3 student student 4096 Jan  1 11:08 .kde
 drwxrwxr-x  3 student student 4096 Jan  1 14:26 .local
 drwx------  3 student student 4096 Jan  1 11:18 .macromedia
 drwx------  3 student student 4096 Jan  1 11:12 .metacity
 drwxr-xr-x  5 student student 4096 Jan  1 11:13 .mozilla
 drwxr-xr-x  3 student student 4096 Jan  1 14:42 .nautilus
 -rw-rw-r--  1 student student  836 Jan  1 17:49 .recently-used.xbel
 drwxrwxr-x  3 student student 4096 Jan  1 11:12 .redhat
 drwxrwxr-x  3 student student 4096 Jan  1 12:06 .themes
 drwx------  3 student student 4096 Jan  1 12:12 .thumbnails
 drwx------  2 student student 4096 Jan  1 11:12 .Trash
 -rw-r--r--  1 student student 1302 Jan  1 17:49 .xsession-errors

Значението на колоните е следното:

  1. Тип на файла и права за ползване в символен вид
  2. Брой на твърдите връзки към файла или брой файлове в директорията
  3. Име на потребителя собственик на файла
  4. Име на групата собственик на файла
  5. Големина на файла в байтове
  6. Месец, ден, час на последена промяна
  7. Име на файла
Разгледайте man ls за други интересни опции.

Смяна на текущата директория

За да навигираме до определена директория в която са файлове с които искаме да работим използваме командата cd (change directory).

Задача: Променете текущата директория на /tmp.

Решение: Използваме командата с параметър името на директорията: cd /tmp.

Задача: Връщане в домашната директория.

Решение: Изпълнете cd без параметри.

Задача: Променете текущата директория да бъде поддиректорията Desktop, която се намира в домашната директория.

Решение: Ако се намирате в дом. директория изпълнете cd Desktop - използваме относителен път до директорията. Ако сте в друга директория изпълнете cd ~/Desktop.

Определяне на текущата работна директория

Използва се командата pwd (present working directory). Тя отпечатва името на директорията в която се намираме.

Задача: Да се изпълнят упражненията за смяна на директорията като всеки път се извиква pwd, за да определим къде се намираме.

 $ pwd
 /home/student
 $ cd /tmp/
 $ pwd
 /tmp
 $ cd
 $ pwd
 /home/student
 $ cd Desktop/
 $ pwd
 /home/student/Desktop

Създаване на празни файлове

Празните файлове могат да служат за флагове на някакво състояние (пр. дадена програма работи и 2-ро копие на програмата неможе да се пусне), да послужат като контейнер за бъдещи данни (пр. създаваме празен файл, след което добавяме редове текст към него). За създаване на празни файлове използваме командата touch. С нея можем да променим и времето на модификация на даден файл, без да променяме данните в него.

Задача: Да се създадат файлове представляващи отчет за месеците в годината.

Решение: Извикваме touch с имената на файловете, които искаме да създадем.

 $ touch Jan
 $ touch Feb
 $ touch Mar
 $ touch Apr May Jun Jul Aug Sep Oct
 $ touch Nov Dec
 $ ls -l
 total 56
 -rw-rw-r-- 1 student student    0 Jan  1 18:31 Apr
 -rw-rw-r-- 1 student student    0 Jan  1 18:31 Aug
 -rw-rw-r-- 1 student student    0 Jan  1 18:32 Dec
 drwxr-xr-x 2 student student 4096 Jan  1 17:48 Desktop
 -rw-rw-r-- 1 student student    0 Jan  1 18:31 Feb
 -rw-rw-r-- 1 student student    0 Jan  1 18:31 Jan
 -rw-rw-r-- 1 student student    0 Jan  1 18:31 Jul
 -rw-rw-r-- 1 student student    0 Jan  1 18:31 Jun
 -rw-rw-r-- 1 student student    0 Jan  1 18:31 Mar
 -rw-rw-r-- 1 student student    0 Jan  1 18:31 May
 -rw-rw-r-- 1 student student    0 Jan  1 18:32 Nov
 -rw-rw-r-- 1 student student    0 Jan  1 18:31 Oct
 -rw-rw-r-- 1 student student    0 Jan  1 18:31 Sep

Задача: Промяна датата на модифициране на файл.

Решение: Използваме същата команда като за създаване на файл, но този път тя ще промени само датата и часа на файла. Забележете разликата в часа.

 $ ls -l May 
 -rw-rw-r-- 1 student student 0 Jan  1 18:31 May
 $ touch May 
 $ ls -l May 
 -rw-rw-r-- 1 student student 0 Jan  1 18:34 May

Създаване на директории

Създаването на директории ни помага да организираме файловете според някакъв критерии. За тази цел използваме командата mkdir (make directory).

Задача: Да се създадат директории за съхранение на отчетите и задачите за всеки месец.

Решение: Използваме mkdir с имената на директориите.

 $ mkdir reports todo
 $ ls -l 
 total 72
 -rw-rw-r-- 1 student student    0 Jan  1 18:31 Apr
 -rw-rw-r-- 1 student student    0 Jan  1 18:31 Aug
 -rw-rw-r-- 1 student student    0 Jan  1 18:32 Dec
 drwxr-xr-x 2 student student 4096 Jan  1 17:48 Desktop
 -rw-rw-r-- 1 student student    0 Jan  1 18:31 Feb
 -rw-rw-r-- 1 student student    0 Jan  1 18:31 Jan
 -rw-rw-r-- 1 student student    0 Jan  1 18:31 Jul
 -rw-rw-r-- 1 student student    0 Jan  1 18:31 Jun
 -rw-rw-r-- 1 student student    0 Jan  1 18:31 Mar
 -rw-rw-r-- 1 student student    0 Jan  1 18:34 May
 -rw-rw-r-- 1 student student    0 Jan  1 18:32 Nov
 -rw-rw-r-- 1 student student    0 Jan  1 18:31 Oct
 drwxrwxr-x 2 student student 4096 Jan  1 18:38 reports
 -rw-rw-r-- 1 student student    0 Jan  1 18:31 Sep
 drwxrwxr-x 2 student student 4096 Jan  1 18:38 todo

Задача: Да се създадат директории за съхранение на отчетите и задачите за всеки месец за двамата потребители alice и bob.

Решение: Използваме mkdir с параметър -p (make parent directories) за създаване на родителските директории.

 bob/:
 total 16
 drwxrwxr-x 2 student student 4096 Jan  1 18:50 reports
 drwxrwxr-x 2 student student 4096 Jan  1 18:50 todo

В примера по-горе използвахме съкратен запис на аргументите, за да избегнем повторно писане на една и съща команда. Това е възможно, т.к. обвивката разширява съкратения запис и той е еквивалентен на mkdir -p alice/reports alice/todo bob/reports bob/todo.

Копиране на файлове

Копирането на файлове се извършва чрез командата cp (copy).

Задача: Да се копират месечните файлове в директорията с отчети и задачи на alice.

Решение: cp копира всички файлове зададени като параметър без последния. Последния параметър е името на директорията в която ще се копират файловете или новото име под което ще се копира само един файл.

 alice/reports:
 total 48
 -rw-rw-r-- 1 student student 0 Jan  1 18:59 Sep
 -rw-rw-r-- 1 student student 0 Jan  1 18:59 Oct
 -rw-rw-r-- 1 student student 0 Jan  1 18:59 Nov
 -rw-rw-r-- 1 student student 0 Jan  1 18:59 May
 -rw-rw-r-- 1 student student 0 Jan  1 18:59 Mar
 -rw-rw-r-- 1 student student 0 Jan  1 18:59 Jun
 -rw-rw-r-- 1 student student 0 Jan  1 18:59 Jul
 -rw-rw-r-- 1 student student 0 Jan  1 18:59 Jan
 -rw-rw-r-- 1 student student 0 Jan  1 18:59 Feb
 -rw-rw-r-- 1 student student 0 Jan  1 18:59 Dec
 -rw-rw-r-- 1 student student 0 Jan  1 18:59 Aug
 -rw-rw-r-- 1 student student 0 Jan  1 18:59 Apr

Задача: Да се копира директорията на alice в директорията на bob.

Решение: Копираме рекурсивно цялата директория чрез cp -r.

 $ cp -r alice/ bob/
 $ ls -l bob/
 total 24
 drwxrwxr-x 4 student student 4096 Jan  1 19:02 alice
 drwxrwxr-x 2 student student 4096 Jan  1 18:50 reports
 drwxrwxr-x 2 student student 4096 Jan  1 18:50 todo

Преместване и преименуване на файлове

Преместването и преименуването се извършва чрез командата mv (move). Не съществува отделна команда за преименуване, т.к. преименуването е еквивалентно на преместване на файла под ново име.

Задача: Да се преместят файловете за всички месеци от домашната директория в директорията с отчети на bob.

Решение: Използваме mv с аргументи списък на файловете, а накрая е директорията в която искаме те да бъдат преместени.

 $ ls
 alice  Apr  Aug  bob  Dec  Desktop  Feb  Jan  Jul  Jun  Mar  May  Nov  Oct  reports  Sep  todo
 $ mv Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec bob/reports/
 $ ls
 alice  bob  Desktop  reports  todo
 $ ls bob/reports/
 Apr  Aug  Dec  Feb  Jan  Jul  Jun  Mar  May  Nov  Oct  Sep

Задача: Да се преименуват всички файлове в директорията bob/reports като се добави разширение .txt в края.

Решение: Използваме mv с аргумент името на файла и новото име.

 $ pwd
 /home/student/bob/reports
 $ ls
 Apr  Aug  Dec  Feb  Jan  Jul  Jun  Mar  May  Nov  Oct  Sep
 $ mv Jan Jan.txt
 $ mv Feb Feb.txt
 ...

Вместо многократно повторение на горната команда можем да преименуваме всички файлове в директорията чрез следната команда (кратък скрипт на командния ред):

 $ for f in `ls`; do mv $f $f.txt; done
 $ ls
 Apr.txt  Aug.txt  Dec.txt  Feb.txt  Jan.txt  Jul.txt  Jun.txt  Mar.txt  May.txt  Nov.txt  Oct.txt  Sep.txt

Премахване на файлове

За премахване на файлове използваме командата rm (remove).

Задача: Да се премахнат файловете в директория bob/reports. Решение: Използваме rm с параметър имената на файловете, които искаме да премахнем. Използваме съкратен запис в примера по-долу:

 $ pwd
 /home/student/bob/reports
 $ rm *.txt

Задача: Да се премахнат всички директории създадени в предишните упражнения.

Решение: Използваме rm -rf, за да премахнем рекурсивно всички файлове и директории. -f (force) избягва въпроса за потвърждение дали искаме да изтрием даден файл. Използвайте ВНИМАТЕЛНО!

 $ cd
 $ pwd
 /home/student
 $ ls
 alice  bob  Desktop  reports  todo
 $ rm -rf alice/ bob/ reports/ todo/
 $ ls
 Desktop

Отпечатване цялото съдържание на файл

Използваме командата cat, за да отпечатаме един или няколко файла. Съдържанието им се извежда на стандартния изход. Най-често използваме тази команда, за да прочетем съдържанието на файла.

Задача: Да се изведе съдържанието на файловете /etc/redhat-release и /etc/issue по отделно.

Решение: Извикваме cat два пъти с името на файла, който искаме да отпечатаме.

 $ cat /etc/redhat-release 
 Red Hat Enterprise Linux Server release 5.3 (Tikanga)

Задача: Да се отпечата съдържанието на двата файла едновременно. Решение: Използваме cat с два параметъра - имената на файловете.

 Red Hat Enterprise Linux Server release 5.3 (Tikanga)

Добавяне съдържание към файл

Командата echo може да се използва за създаване на файлове с някакво съдържание и за добавяне на текст към тези файлове.

Задача: Да се създаде файл съдържащ вашето име.

Решение: Използваме echo с параметър името, заградено в кавички и пренасочваме изхода към файл.

 $ echo "Alexander" > students
 $ cat students 
 Alexander

Задача: Да се добавят имената на други студенти към същия файл, без да се изтрие първоначалното съдържание.

Решение: Отново използваме echo, но този път използваме оператора за добавяне към файл (двойна стрелка), вместо този за пренасочване.

 $ echo "Ivan" >> students
 $ echo "Geogri" >> students
 $ cat students 
 Alexander
 Ivan
 Geogri

Разглеждане съдържанието на файл по страници

Ако използваме cat с големи файлове, съдържанието ще се отпечати на терминала много бързо и няма да можем да го прочетем. Това което остава са последните редове само. Затова използваме командата less, която предоставя възможност за разглеждане на файловете по страници. Можем да се движим със стрелките нагоре/надолу и да прелистваме съдържанието на файла. Затваряме отворения файл с натискането на клавиш "q".

Можем също така да извършваме търсене във файла. less се използва като подразбрана команда за преглед на файлове от много други програми, които предоставят информация за четене на потребителя.

Задача: Да се разгледа съдържанието на голям файл с cat и less и да се обърне внимание на разликата между тях.

Решение: Файлове, които не се събират на една страница (от екрана) са налични в документацията на почти всички програми. За примера използваме файл от документацията на Bash (версия 3.2).

  • cat /usr/share/doc/bash-3.2/FAQ ще изведе цялото съдържание на екрана. Можем да се движим нагоре/надолу с колелцето на мишката или като използваме клавишите Shift+PgUp/Shift+PgDn. Файлът е достатъчно голям, за да неможем да прелистим чак до началото.
  • Използвайки less /usr/share/doc/bash-3.2/FAQ файлът ще бъде изведен интерактивно на екрана. Можем да се движим нагоре/надолу в текста чрез стрелките на клавиатурата или PgUp/PgDn (минава на следващата страница).
Задача: Търсене в less. Да се намери параграфа в горния файл съдържащ текста "DJ Delorie" (повече за този човек можете да намерите тук). Проверете дали текста не се съдържа повече пъти.

Решение

  1. Отворете файла с less (виж по-горе) или се придвижете в началото с натискане на клавиш Home.
  2. Търсенето става чрез натискане на клавиш "/" (дясно наклонена черта).
  3. След наклонената черта веднага напишете текста, който търсите (без кавичките) и натиснете клавиш Enter. Регистъра на буквите има значение.
  4. Текстът на екрана се премества т.ч. това което търсите да е най-отгоре. Самият текст, който съвпада е маркиран с различен цвят (в зависимост от терминала).
  5. Натиснете клавиш "n", за да проверите за следващо съвпадение. Няма такова.
Задача: Търсете в горния файл думата "bash". Обърнете внимание как се придвижва текста с всяко следващо търсене. Намерете последното срещане на тази дума.

Решение

  1. Отворете файла с less (виж по-горе) или се придвижете в началото с натискане на клавиш Home.
  2. Търсете за думата "bash".
  3. Натиснете няколко пъти клавиша "n", за да се придвижите до следващото съвпадение. Какво се случва когато стигнете до последното съвпадение?
  4. Придвижете се в края на файла в натискането на клавиш End.
  5. Търсенето в обратна посока се осъществява чрез клавиш "?" следван от текста за търсене и Enter.
  6. Този път с натискането на "n" ще се движите отдолу нагоре, намирайки съвпаденията.
Задача: Да се открие на кой ред се намира последното срещане на думата "bash"

Решение

  1. Отворете файла използвайки опция -N: less -N /usr/share/doc/bash-3.2/FAQ. Тя показва номерата на редовете.
  2. Отидете в края на файла.
  3. Търсете в обратна посока думата "bash".
  4. В този пример последното съвпадение е на ред 1823.
Задача: Разгледайте съдържанието на директорията /usr/bin по страници.

Решение: За да решим задачата използваме комбинация от две команди. ls и less. Спомнете си, че командите в Линукс могат да се комбинират една с друга. ls -l /usr/bin/ | less ще изведе списък на файловете в директорията и ще го подаде към less, където той ще бъде изведен по страници.

Извеждане началните редове на файл

Командата head се използва за извеждане на началните редове/байтове от файл. По подразбиране това са първите десет реда.

Задача: Да се изведат първите десет реда от файла /usr/share/doc/bash-3.2/FAQ.

Решение: Използваме head без допълнителни опции с параметър името на файла.

 This document contains a set of frequently-asked questions concerning
 Bash, the GNU Bourne-Again Shell.  Bash is a freely-available command
 interpreter with advanced features for both interactive use and shell
 programming.
 
 Another good source of basic information about shells is the collection
 of FAQ articles periodically posted to comp.unix.shell.

Задача: Да се изведе само първия ред от горния файл.

Решение: Използваме опцията -n, която контролира броя на изведените редове.

 $ head -n 1 /usr/share/doc/bash-3.2/FAQ
 This is the Bash FAQ, version 3.34, for Bash version 3.2.

Задача: Да се изведат първите 20 байта(символа) от горния файл.

Решение: Използваме опцията -c, която контролира броя байтове (не редове), които да се изведат. От примера се вижда, че в края не се отпечатва знака за нов ред.

 $ head -c 20 /usr/share/doc/bash-3.2/FAQ
 This is the Bash FAQ$

Извеждане последните редове от файл

Командата tail има действие обратно на head. Тя извежда последните редове/байтове от даден файл. По подразбиране извежда последните десет реда.

Задача: Да се изведе последния 1 ред от файла /usr/share/doc/bash-3.2/FAQ

Решение: Използваме опцията -n, която контролира броя на редовете.

 $ tail -n 1 /usr/share/doc/bash-3.2/FAQ
 contents of this document remain unaltered.

Задача: Да се изведат последните 11 байта от горния файл.

Решение: Както при head използваме опцията -c, която контролира броя байтове, които се извеждат.

 $ tail -c 11 /usr/share/doc/bash-3.2/FAQ
 unaltered.

Задача: Да се проследи интерактивно файл, който непрекъснато се увеличава.

Решение: За тази задача са ви необходими два терминала. Използваме опцията -f (follow), за да инструктираме tail да следи файла в интерактивен режим и да отпечатва новите редове когато се появят.

  1. Започнете със празен файл. (touch students).
  2. В единия терминал изпълнете: tail -f students. Това ще отвори файла в интерактивен режим на показване. Файлът все още е празен.
  3. В друг терминал изпълнете командата for i in `seq 5`; do sleep 5; echo "student $i" >> students; done. Тя ще добавя по един ред на всеки пет секунди във файла. Трябва да я изпълните от същата директория в която е файла.
  4. След като напишете горната команда и натиснете Enter, веднага превключете на първия терминал. Наблюдавайте как редовете се появяват един след друг на всеки пет секунди.
  5. Прекратете изпълнението на tail чрез натискане на Ctrl+C

Други команди

В Линукс съществуват хиляди команди, които представляват различни програми. С натискането на клавиш Tab ще бъдете попитани дали искате да се изведе информация за всички налични команди/програми, които можете да изпълните. В една стандартна инсталация те са над 3000. За всяка от наличните команди можете да потърсите описание в помощната и страница чрез man тема или info тема, където темата е името на командата. За повече от стандартните команди пробвайте man builtins. Тези команди са вградени в обвивката (Bash), за да се изпълняват по-бързо.

Връзки

Clone this wiki locally