Systemy Operacyjne - laboratoria 3 i 4 - teoria
Pliki: rodzaje, właściwości, prawa, podstawowe operacje
Celem laboratorium jest zapoznanie studentów z podstawowymi informacjami na temat plików w
systemie UNIX. W szczególności z ich rodzajami (typami), właściwościami oraz powiązanymi z
nimi prawami. Dodatkowo na zajęciach tych studenci powinni poznać polecenia wykorzystywane
do różnorakich operacji na plikach.
Laboratorium obejmuje następujące tematy:
✔ postać UNIX-owego systemu plików (polecenia: ls, dir, vdir, tree),
✔ rodzaje plików w systemie UNIX,
✔ właściwości plików, prawa do plików, typy plików (polecenia: chmod, chgrp, chown, ln)
✔ wyświetlanie zawartości plików (polecenia: cat, more, less, head, tail, wc),
✔ tworzenie, kopiowanie, przenoszenie i usuwanie plików (polecenia: touch, cp, mv, rm, mkdir,
rmdir).
Pliki
W UNIX-ie (Linux-ie), inaczej niż w innych systemach operacyjnych, pojęcie pliku ma kluczowe i
centralne znaczenie [3]. Na przykład polecenia (programy) są wykonywalnymi plikami,
przechowywanymi w z góry przewidywalnych miejscach drzewa katalogowego. Systemowe
przywileje i prawa dostępu kontrolowane są prawie wyłącznie przez prawa dostępu do
odpowiednich plików. Nawet realizacja operacji wejścia/wyjścia do urządzeń i do plików jest
nierozróżnialna z punktu wiedzenia użytkowników. Także komunikacja między procesami odbywa
się przy użyciu struktur reprezentowanych w systemie jako pliki. Dlatego więc pojęcie pliku oraz
struktura drzewa katalogowego są jednymi z pierwszych rzeczy, z którymi powinniście się Państwo
zapoznać jako użytkownicy UNIX-a.
Tak jak większość współczesnych systemów operacyjnych [1], UNIX charakteryzuje się
hierarchiczną, drzewiastą strukturą organizacyjną, nazywaną systemem plików. Pień tego drzewa
(lub jak kto woli jego korzeń) stanowi katalog główny (ang. root directory). Katalog ten jest
oznaczany jest zastrzeżonym symbolem “/” (ang. slash).
$ tree / -dxL 1
/
|-- bin
|-- boot
|-- dev
|-- etc
|-- home
|-- initrd
1
|-- lib
|-- mnt
|-- opt
|-- proc
|-- root
|-- sbin
|-- tmp
|-- usr
`-- var
15 directories
Ca a przestrze dyskowa przeznaczona dla u ytkowników systemu dost pna ł ń ż ę jest w ramach tego
jednego drzewa katalogowego. Ponadto UNIX-owy opis pliku nie zawiera informacji o fizycznym
dysku, na którym plik ten faktycznie się znajduje.
Dostęp do plików zależy od tego, kto jest właścicielem pliku oraz jakie są prawa dostępu.
Bezpieczeństwo zasobów systemu UNIX zależy w dużym stopniu właśnie od tego, jakich
właścicieli i prawa dostępu posiadają pliki w połączeniu ze strukturą kont i grup użytkowników
systemu.
Właściciel pliku
Przydzielanie właściciela plikom w UNIX-ie jest nieco bardziej skomplikowane, niż w innych
systemach operacyjnych. Oprócz zwykłego właściciela, każdy plik ma również właściciela
grupowego, czyli grupę pliku. Użytkownik będący właścicielem pliku wcale nie musi być nawet
członkiem grupy, która jest grupą pliku, chociaż oczywiście najczęściej zdarza się, że grupa pliku,
jest grupą główną (tzw. login grupą) właściciela pliku.
Aby wyświetlić informacje o właścicielu pliku można wykorzystać omawiane już polecenie “ls -l”.
$ ls -l
razem 2
-rwxrwxrwx 1 student student 15421 paź 10 11:15 asu_gk_l_03_teoria.pdf*
-rwxrwxrwx 1 student student 8148 paź 7 14:16 asu_gk_l_03_zadania.pdf*
Zgodnie z tym co powiedziano przy okazji omawiania polecenia ls, trzecia kolumna wyświetla
nazwę właściciela pliku a czwarta nazwę grupy pliku.
Właścicielem nowo zakładanego pliku jest użytkownik, który go tworzy. Grupa pliku jest jednak
przydzielana w nieco bardziej złożony sposób, odmienny w różnych systamch UNIX-owych:
w Systemie V grupa pliku jest taka sama, jak bieżąca grupa użytkownika tworzącego plik
(również w Linux-ie),
w systemach typu BSD grupa pliku jest taka sama, jak grupa katalogu, w którym dany plik jest
tworzony (można wymusić takie zachowanie w Linux-ie, dodając do katalogu atrybut SGID,
szczegóły można odnaleźć w [2] i [3]).
Do zmiany właściciela i grupy pliku można wykorzystać polecenia “chown” (zmiana użytkownika)
i “chgrp” (zmiana grupy), polecenia te są szczegółowo opisane w dalszej części tego dokumentu.
Typy praw dostępu do plików i katalogów
Kiedy określony jest właściciel pliku, naturalne jest ustalenie, w jaki sposób plik będzie chroniony
2
przed niepowo anym dost pem (z drugiej strony za , w jaki sposób umo liwi ł ę ś ż ć dostęp do pliku tym
użytkownikom, którzy go potrzebują). Ochronę taką stanowią w UNIX-iep rawa dostępu do pliku.
Prawa dostępu do pliku ustala się przy pomocy polecenia “chmod” (jest ono omawiane w dalszej
części).
W UNIX-ie występują trzy typy praw dostępu do pliku: prawo czytania, pisania i wykonywania,
oznaczane odpowiednio literami r, w oraz x. Poniższa tabela opisuje ich znaczenie [3].
Prawo Znaczenie dla zwykłych plików Znaczenie dla katalogów
r Oglądanie zawartości pliku. Przeszukiwanie zawartości katalogu (np. w
celu wykonania polecenia ls).
w Modyfikowanie zawartości pliku. Modyfikowanie zawartości katalogu (np.
usuwanie z niego plików).
x Uruchomienie pliku wykonywalnego.
Uczynienie danego katalogu katalogiem
bieżącym (np. przy pomocy polecenia cd).
Kolejna tabela podsumowuje możliwości wynikające z różnych praw do katalogów [3].
Typy praw
dostępu Rezultat
---
Brak praw
Brak możliwości wykonywania jakichkolwiek operacji na plikach bądź
podkatalogach danego katalogu.
r--
Prawo czytania
Użytkownicy mogą wyświetlać nazwy plików z danego katalogu, bez
możliwości oglądania jednak ich atrybutów (tzn. rozmiaru, właściciela, praw
dostępu itd.).
--x
Tylko prawo
wykonywania
Użytkownicy mogą wykonywać tylko te programy z danego katalogu, o których
wiedzą, że się w nim znajdują. Nie moga obejrzeć nazw pozostałych plików.
r-x
Prawo czytania
i wykonywania
Umożliwia użytkownikom pracę z programami z danego katalogu oraz
wyświetlanie jego zawartości, ale nie pozwala na tworzenie i usuwanie plików z
danego katalogu.
rwx
Prawo czytania,
pisania i
wykonywania
Użytkownicy moga pracować z dowolnymi plikami w danym katalogu,
wyświetlać jego zawartość oraz tworzyć i usuwać dowolne pliki z tego katalogu.
Klasy praw dostępu
Prawa dostępu do plików w UNIX-ie są definiowane niezależnie dla trzech klas użytkowników:
prawa dostępu dla właściciela “u” (ang. user) - przydzielone właścicielowi,
prawa dostępu dla grupy “g” (ang. group) - przydzielone wszystkim członkom grupy, która jest
grupą pliku,
prawa dostępu dla pozostałych “o” (ang. other) - przydzielone wszystkim pozostałym
użytkownikom systemu (z wyjątkiem root-a).
3
Ustawianie ochrony pliku czy katalogu w UNIX-ie polega na podaniu, jakie typy praw dostępu
przydzielamy poszczególnym klasom użytkowników.
Prawa dostępu możemy wyświetlić przy pomocy polecenia ls:
$ ls -l
razem 2
-rwxrwxrwx 1 student student 15421 paź 10 11:15 asu_gk_l_03_teoria.pdf*
-rwxrwxrwx 1 student student 8148 paź 7 14:16 asu_gk_l_03_zadania.pdf*
Są one prezentowane w pierwszej z kolumn. Znak “-” i litery występujące na początku każdej linii
reprezentują tryb pliku (czyli typ pliku i prawa dostępu). Znaczenie tych 10 znaków wyjaśnia
kolejna tabela [3].
Typ
pliku
Prawa dla
właściciela Prawa dla grupy Prawa dla
pozostałych
- r w x r w x r w x
Pozycja 1 2 3 4 5 6 7 8 9 10
Prawo czytania * * *
Prawo pisania * * *
Prawo wykonania * * *
Pierwszy znak opisuje typ pliku. Znak minus pojawiający się na tym miejscu oznacza plik zwykły,
litera “d” natomiast katalog (pozostałe typy plików opisano dalej). Pozostałe 9 znaków należy
rozpatrywać trójkami. Pierwsza trójka dotyczy właściciela, druga grupy pliku, ostatnia zaś
pozostałych użytkowników systemu. W każdej trójce znajdują się trzy znaki, reprezentujące prawo
czytania, pisania i wykonywania pliku. Jeżeli dane prawo jest ustawione, w odpowiedniej trójce
pojawia się reprezentująca je litera. Jeśli nie, zastępuje ją znak minus.
Typy plików
Występowanie wielu typów plików spowodowane jest tym, że w UNIX-ie wszytko traktowane jest
jako plik. Nawet operacje wejścia/wyjścia z urządzeń reprezentowane są jako operacje na
odpowiednich plikach. Każdy typ pliku pełni w systemie odrębne funkcje.
Pliki zwykłe (oznaczane znakiem “-”) są plikami zawierającymi dane. Często określane są po
prostu jako “pliki”. Mogą to być wykonywalne pliki binarne, pliki wejściowe lub wyjściowe
programów, pliki zawierające teksty ASCII i wiele innych.
Katalogi (oznaczane litera “d”) są to pliki binarne zawierające listę plików (w tym innych
katalogów), które się w nich znajdują.
Pliki specjalne są to pliki umożliwiające realizację operacji wejścia/wyjścia z urządzeń. Pliki te
są przechowywane standardowo w katalogu “/dev” oraz w jego podkatalogach. Możemy
wyróżnić dwa podstawowe typy plików specjalnych: pliki specjalne znakowe (oznaczane litera
“c”) oraz pliki specjalne blokowe (oznaczane litera “b”). Więcej szczegółów na ten temat
możecie Państwo odnaleźć w [2] i [3].
Linki czyli pliki umożliwiające tworzenie wielu nazw dla pojedynczego pliku dyskowego.
Wyróżniamy dwa rodzaje linków: linki twarde i linki symboliczne. Link twardy umożliwia
tworzenie dwóch lub więcej nazw dla jednego i-węzła (co to takiego “i-węzły” możecie się
Państwo dowiedzieć szczegółowo z [2], dla uproszczenia można powiedzieć, że jest to obszar
4
partycji dyskowej w którym jest zapisana zawarto c pliku). Linki twarde ś dotyczą więc tego
samego fizycznego pliku dyskowego, ale każdy z nich stanowi oddzielne wejście w
odpowiednich katalogach (dzieki temu po skasowaniu jednego pliku, nadal możemy się dostać
do jego zawartości wykorzystując drugą nazwę). Linki symboliczne natomiast są plikami
wskazującymi na nazwę innego pliku zlokalizowanego w dowolnym miejscu systemu (w ich
przypadku nie ma ograniczenia do obszaru jednej partycji). Ponieważ linki symboliczne
wskazują na nazwę pliku zamiast na jego fizyczną lokalizację, mogą przekraczać fizyczne
granice urządzeń. Jednakże inaczej niż w przypadku linków twardych, skasowanie pliku na
którego nazwę wskazuje link symboliczny, sprawi, że będzie on wskazywał na nieistniejący
obiekt (analogia: skróty w systemie Windows pokazujące na już usunięte pliki). W przypadku
wyświetlania zawartości katalogu mieszczącego plik i link twardy, okaże się, że są one
nierozróżnialne. Odmienna sytuacja występuje w przypadku linków symbolicznych oznaczanych
literą “l” w polu określającym typ pliku. Szczegółowe przykłady tworzenia i różnych
właściwości obu rodzajów linków możecie Państwo odnaleźć w dalszej części, przy okazji
omawiania polecenia “ln”.
Sockety (oznaczane literą “s”) czyli pliki specjalne wykorzystywane do komunikacji między
procesami. Sockety (gniazda) sa nierozerwalnie związane z oprogramowaniem sieciowym
TCP/IP.
Nazwane potoki (oznaczane litera “p”) są potokami, do których aplikacje mogą się odwoływać
za pomocą nazwy. Stanowią one, po socketach, kolejny mechanizm komunikacji między
procesami.
Wyświetlając zawartość katalogu przy pomocy polecenia “ls -l”, typ pliku rozpoznajemy zwracając
uwagę na znak poprzedzający prawa dostępu:
Znak Znaczenie
- Plik zwykły (twardy link).
d Katalog
l Link symboliczny
b Plik specjalny blokowy
c Plik specjalny znakowy
s Socket
p Nazwany potok
Dalsza część dokumentu zawiera krótkie opisy poleceń omawianych na laboratorium.
Polecenie ls
Polecenie ls było omawiane na poprzednich zajęciach, niniejszy opis stanowi uzupełnienie
prezentowanych tam treści.
W systemie UNIX większość plików konfiguracyjnych, czy też katalogów przechowujących
różnorakie ustawienia posiada tę własność, że ich nazwa rozpoczyna się od znaku “.”. Dzięki tej
zasadzie, polecenie ls może pomijać te pliki, wyświetlając zawartość katalogów, gdyż informacja o
nich byłaby w większości wypadków zbędna (podczas normalnej pracy z plikami). W związku z
tym polecenie to posiada specjalną opcję “-a”, umożliwiającą wyświetlanie wszystkich plików i
katalogów (również tych, których nazwa rozpoczyna się od znaku “.”).
5
Poni sze przyk ady pokazuj ró nic w dzia aniu ls z opcj “-ż ł ą ż ę ł ą a” i bez tej opcji:
$ mkdir tmp
$ cd tmp
$ > plik1.txt
$ > plik2.txt
$ > plik3.txt
$ > .plik4.txt
$ > .plik5.txt
$ > .plik6.txt
$ mkdir tmp1
$ mkdir .tmp2
$ ls -l
razem 4
-rw-r--r-- 1 student student 0 paź 12 14:42 plik1.txt
-rw-r--r-- 1 student student 0 paź 12 14:42 plik2.txt
-rw-r--r-- 1 student student 0 paź 12 14:42 plik3.txt
drwxr-xr-x 2 student student 4096 paź 12 14:43 tmp1/
$ ls -l -a
razem 16
drwxr-xr-x 4 student student 4096 paź 12 14:43 ./
drwxr-xr-x 21 student student 4096 paź 12 14:42 ../
-rw-r--r-- 1 student student 0 paź 12 14:42 plik1.txt
-rw-r--r-- 1 student student 0 paź 12 14:42 plik2.txt
-rw-r--r-- 1 student student 0 paź 12 14:42 plik3.txt
-rw-r--r-- 1 student student 0 paź 12 14:42 .plik4.txt
-rw-r--r-- 1 student student 0 paź 12 14:42 .plik5.txt
-rw-r--r-- 1 student student 0 paź 12 14:42 .plik6.txt
drwxr-xr-x 2 student student 4096 paź 12 14:43 tmp1/
drwxr-xr-x 2 student student 4096 paź 12 14:43 .tmp2/
Dodatkowo, z opcją “-a”, polecenie ls wyświetla również katalog bieżący (oznaczany “.”) oraz
katalog nadrzędny (oznaczany “..”).
Proszę pamiętać o tej dodatkowej opcji!
Polecenie cat
Polecenie cat (ang. concatenate file) jest wykorzystywane (między innymi) do wyświetlania
zawartości pliku na ekranie (można mówić o pewnym - niewielkim - podobieństwie do DOSowego
“type”). Polecenie to może być również wykorzystywane do połączenia ze sobą kilku plików
i zapisania wyniku takiego połączenia w zupełnie nowym pliku (jednak takie użycie cat będzie
przedmiotem naszych zainteresowań dopiero w czasie kolejnych zajęć). W czasie dzisiejszych zajęć
polecenie to posłuży nam wyłącznie do wyświetlania zawartości niewielkich plików tekstowych.
Przykład użycia (wyświetlenie na ekranie terminala zawartości przykładowego pliku o nazwie
“uzytkownicy.sh”):
$ cat uzytkownicy.sh
#!/bin/sh
#
# Prosty skrypt wyswietlajacy podstawowe informacje o uzytkownikach (login,
# pelna nazwe, sciezke do katalogu domowego i jego rozmiar). Dziala w
# oparciu o plik "/etc/passwd".
NAZWA_PLIKU='/etc/passwd'
while read LINIA
do
6
LOGIN=`echo $LINIA | awk -F: '{ print $1; }'`
NAZWA=`echo $LINIA | awk -F: '{ print $5; }'`
KATALOG=`echo $LINIA | awk -F: '{ print $6; }'`
echo "LOGIN : $LOGIN"
echo "NAZWA : $NAZWA"
if [ -d "$KATALOG" ] ; then
ROZMIAR=`du -bs $KATALOG | awk '{ print $1; }'`
if [ -z "$ROZMIAR" ]; then ROZMIAR=0; fi
echo "KATALOG : $KATALOG"
echo "ROZMIAR [B] : $ROZMIAR"
fi
echo;
done < $NAZWA_PLIKU;
Polecenie cat tak samo jak reszta UNIX-owych polece posiada wiele ró ń żnorodnych opcji, do
ciekawszych z nich można zaliczyć możliwość numerowania kolejnych linii wyświetlanego pliku:
$ cat -n uzytkownicy.sh
1 #!/bin/sh
2 #
3 # Prosty skrypt wyswietlajacy podstawowe informacje o uzytkownikach
(login,
4 # pelna nazwe, sciezke do katalogu domowego i jego rozmiar). Dziala w
5 # oparciu o plik "/etc/passwd".
6
7 NAZWA_PLIKU='/etc/passwd'
8 while read LINIA
9 do
10 LOGIN=`echo $LINIA | awk -F: '{ print $1; }'`
11 NAZWA=`echo $LINIA | awk -F: '{ print $5; }'`
12 KATALOG=`echo $LINIA | awk -F: '{ print $6; }'`
13 echo "LOGIN : $LOGIN"
14 echo "NAZWA : $NAZWA"
15 if [ -d "$KATALOG" ] ; then
16 ROZMIAR=`du -bs $KATALOG | awk '{ print $1; }'`
17 if [ -z "$ROZMIAR" ]; then ROZMIAR=0; fi
18 echo "KATALOG : $KATALOG"
19 echo "ROZMIAR [B] : $ROZMIAR"
20 fi
21 echo;
22 done < $NAZWA_PLIKU;
Polecenie to może być również wykorzystane do utworzenia i edycji niewielkich plików
tekstowych, bez konieczności użycia edytora tekstowego. Aby to osiągnąć należy wywołać
polecenie cat jak poniżej:
$ cat > nowy_plik.txt
następnie możemy wpisywać tekst,
TO JEST NOWY PLIK!
Na koniec wpisywania wciskamy CTRL+D. Po czym możemy jeszcze sprawdzić, że faktycznie
udało się nam utworzyć nowy plik.
$ ls -l
razem 14
-rw-r--r-- 1 student student 14 paź 6 19:15 nowy_plik.txt
Polecenie more
7
O ile polecenie cat mo e by przydatne do wy wietlania zawarto ci niewielkich ż ć ś ś plików, o tyle w
przypadku plików większych bardziej przydatne okaże się polecenie more. Polecenie to jest jednym
z wielu dostępnych w Linux-ie programów do wyświetlania tekstu strona po stronie lub linia po linii
(tak naprawdę polecenie man również korzysta z takiego dodatkowego polecenia do wyświetlania
stron z pomocą - i zazwyczaj jest to właśnie more lub opisane dalej less).
Polecenie to może być wykorzystywane jak poniżej:
$ more nazwa_pliku
W czasie pracy możecie Państwo uzyskać pomoc na temat użytkowania polecenia (wystarczy
wcisnąć klawisz “h”). Przemieszczanie do przodu (oglądanie kolejnych stron pliku) po naciśnięciu
spacji, ruch w stronę przeciwną po wciśnięciu “b”. Polecenie kończy swoje działanie po
wyświetleniu całej zawartości pliku (alternatywnie możemy wcisnąć “q”).
Polecenie less
Polecenie less stanowi rozbudowaną wersję more i oferuje znacznie wygodniejsze przeglądanie
plików, szczególnie gdy chodzi o możliwość przewijania ich zawartości (wykorzystanie strzałek) i
zaawansowane możliwości wyszukiwania. Polecenie nie kończy działania po wyświetleniu całej
zawartości pliku (inaczej niż more).
Polecenie head
Polecenie to nie służy w zasadzie do wyświetlania zawartości pliku strona po stronie, ale może być
wykorzystane do wyświetlenia początkowego fragmentu wskazanego pliku.
Najczęściej stosowaną opcją tego polecenia jest “-n x” gdzie x oznacza liczbę początkowych linii
pliku, które chcemy wyświetlić.
W kolejnym przykładzie wyświetlanie trzech pierwszych linii pliku “uzytkownicy.sh”:
$ head -n 3 uzytkownicy.sh
#!/bin/sh
##
Prosty skrypt wyswietlajacy podstawowe informacje o uzytkownikach (login,
Polecenie tail
Polecenie to stanowi swoiste przeciwieństwo do head, pozwalając wyświetlić wskazaną liczbę
ostatnich linii pliku. Mimo pozornej bezużyteczności takiego polecenia, bywa ono przydatne,
zwłaszcza wtedy, gdy mamy do przeglądnięcia duży plik a istotne informacje znajdują się na jego
końcu (np. wykaz literatury, przeglądanie plików “.log”).
Poniższy przykład ilustruje wykorzystanie tail (wyświetlenie trzech ostatnich linii pliku
“uzytkownicy.sh”):
$ tail -n 3 uzytkownicy.sh
fi
echo;
done < $NAZWA_PLIKU;
8
Polecenie wc
Polecenie wc (ang. word count) s u y do zliczania liczby bajtów, s ów oraz ł ż ł linii w plikach. W
pewnych sytuacjach informacje te mogą być bardzo przydatne (wypracowania o zadanej liczbie
słów).
Po wywołaniu (bez dodatkowych parametrów) polecenie wc dostarcza nam kompletu informacji
(kolejne liczby to: linie, słowa i bajty):
$ wc uzytkownicy.sh
22 106 672 uzytkownicy.sh
Polecenie touch
Polecenie touch może być w zasadzie wykorzystywane do dwóch celów: tworzenia nowych plików
i zmieniania daty modyfikacji pliku.
Aby utworzyć nowy plik za pomocą touch wystarczy wpisać:
$ touch nazwa_nowego_pliku.txt
$ ls -l nazwa_nowego_pliku.txt
-rw-r--r-- 1 student student 0 paź 7 12:06 nazwa_nowego_pliku.txt
gdzie:
“nazwa_nowego_pliku.txt” - stanowi nazwę nowego pliku, który zamierzamy utworzyć.
Polecenie touch tworzy jak widać nowy plik o rozmiarze równym zero bajtów.
Ten sam efekt można osiągnąć bez wykorzystywania jakiegokolwiek polecenia, wystarczy tzw.
przekierowanie wyjścia (ale o tym będziemy mówić na następnych zajęciach), jak w kolejnym
przykładzie.
$ > nazwa_nowego_pliku.txt
$ ls -l nazwa_nowego_pliku.txt
-rw-r--r-- 1 student student 0 paź 7 12:09 nazwa_nowego_pliku.txt
Efekt jest ten sam co w przypadku touch, po co więc stosować touch ? Po to właśnie by móc
zmienić datę modyfikacji pliku. Co istotne mamy możliwość ustawienia dowolnej (prawie) daty
zarówno z przeszłości jak i przyszłości. Własność tę możemy wykorzystać podczas archiwizacji
danych, czy też automatycznego oczyszczania systemu ze zbędnych plików.
$ touch -t 202901012359 nazwa_nowego_pliku.txt
$ ls -l --full-time nazwa_nowego_pliku.txt
-rw-r--r-- 1 student student 0 2029-01-01 23:59:00.000000000 +0100
nazwa_nowego_pliku.txt
Polecenie cp
Polecenie cp (ang. copy) służy do kopiowania plików i katalogów. Podobnie jak reszta poleceń,
również to posiada olbrzymią liczbę różnorakich opcji, dalsze przykłady pokazują sposób
wykorzystania niektórych z nich.
9
Najprostsz form wywo ania cp jest skopiowanie ą ą ł pliku jak poniżej:
$ cp plik1.txt plik2.txt
W wyniku takiego wywołania zawartość pliku “plik1.txt” jest kopiowana do nowotworzonego pliku
“plik2.txt” (jeżeli plik o tej nazwie istniał wcześniej zostanie on zastąpiony!). Aby zapobiec takiej
możliwości należy wykorzystać polecenie cp z opcjami “-i” lub “-b”.
$ cat > plik1.txt
Pierwszy
$ cat > plik2.txt
Drugi
$ cat > plik3.txt
Trzeci
$ ls -l p*.txt
-rw-r--r-- 1 student student 9 paź 7 12:35 plik1.txt
-rw-r--r-- 1 student student 6 paź 7 12:35 plik2.txt
-rw-r--r-- 1 student student 7 paź 7 12:36 plik3.txt
$ cp plik1.txt plik2.txt
$ ls -l p*.txt
-rw-r--r-- 1 student student 9 paź 7 12:35 plik1.txt
-rw-r--r-- 1 student student 9 paź 7 12:36 plik2.txt
-rw-r--r-- 1 student student 7 paź 7 12:36 plik3.txt
W wyniku powyższej serii poleceń zawartość pliku “plik2.txt” została zastąpiona poprzez
zawartość pliku “plik1.txt” (proszę zwrócić uwagę na rozmiary plików - zostały one celowo
zapisane czcionką wytłuszczoną). Poniżej przykład wykorzystania opcji “-i” (tryb interaktywny).
$ cp -i plik1.txt plik3.txt
cp: zamazać `plik3.txt'? y
$ ls -l p*.txt
-rw-r--r-- 1 student student 9 paź 7 12:35 plik1.txt
-rw-r--r-- 1 student student 9 paź 7 12:36 plik2.txt
-rw-r--r-- 1 student student 9 paź 7 12:41 plik3.txt
Polecenie cp może być również wykorzystane do kopiowania większej liczby plików za jednym
razem.
$ cp p*.txt tmp/
$ tree tmp
tmp
|-- plik1.txt
|-- plik2.txt
`-- plik3.txt
0 directories, 3 files
Polecenie cp może być również wykorzystywane do rekursywnego kopiowania zawartości
podkatalogów (w pewnych sytuacjach może być to niebezpieczne, lepiej stosować opcję “-R”).
$ cp p*.txt tmp/tmp1
$ cp p*.txt tmp/tmp2
$ tree tmp
tmp
|-- plik1.txt
|-- plik2.txt
|-- plik3.txt
|-- tmp1
| |-- plik1.txt
10
| |-- plik2.txt
| `-- plik3.txt
|-- tmp2
| |-- plik1.txt
| |-- plik2.txt
| `-- plik3.txt
`-- tmp3
3 directories, 9 files
$ cp -r tmp tmp4
$ tree tmp4
tmp4
`-- tmp
|-- plik1.txt
|-- plik2.txt
|-- plik3.txt
|-- tmp1
| |-- plik1.txt
| |-- plik2.txt
| `-- plik3.txt
|-- tmp2
| |-- plik1.txt
| |-- plik2.txt
| `-- plik3.txt
`-- tmp3
4 directories, 9 files
Kolejn ciekaw opcj jest “-P” (lepiej u y d ugiej formy “--parents”), przydaje ą ą ą ż ć ł się ona wtedy, gdy
chcemy nie tylko skopiować pliki, ale także zachować informację o strukturze katalogów.
$ cp tmp4/tmp/plik1.txt tmp5
$ tree tmp5
tmp5
`-- plik1.txt
0 directories, 1 file
$ cp --parents tmp4/tmp/plik1.txt tmp6
$ tree tmp6
tmp6
`-- tmp4
`-- tmp
`-- plik1.txt
2 directories, 1 file
Polecenie mv
Polecenie mv (ang. move) służy do przenoszenia plików i katalogów oraz zmieniania ich nazwy.
Najprościej wykorzystać polecenie mv do zmiany nazwy pliku:
$ ls
plik1.txt
$ mv plik1.txt plik2.txt
$ ls
plik2.txt
Podobie jak przy cp, również w przypadku mv możemy doprowadzić do zamazania jednego pliku
drugim (i podobnie możemy sobie z tym poradzić - “-i”).
11
Ciekaw opcj jest “-b” pozwalaj ca stworzy kopi bezpiecze stwa ą ą ą ć ę ń przed zamazaniem
docelowego pliku.
$ ls
plik1.txt plik2.txt
$ mv -bi plik1.txt plik2.txt
mv: zamazać `plik2.txt'? y
$ ls
plik2.txt plik2.txt~
Plik z kopią bezpieczeństwa z reguły (można to dowolnie zmieniać) ma rozszerzenie “~”.
Polecenie rm
Polecenie rm (ang. remove) służy do usuwania plików (w zasadzie również katalogów). Jest to
polecenie, podczas pracy z którym, powinniśmy zachowywać szczególną ostrożność (czymś w
rodzaju dowcipu może być zalogowanie się jako “root” i wydanie polecenia “rm -fr /*”, jednak ten
dowcip jest śmieszny tylko przez krótką chwilę).
Pliki usunięte za pomocą rm nie podlegają odtworzeniu (a w każdym razie nie w prosty sposób)!
Poniżej przykłady wykorzystania:
$ ls
plik1.txt plik2.txt plik3.txt
$ rm plik1.txt
rm: remove zwykły plik `plik1.txt'? y
$ ls
plik2.txt plik3.txt
$ rm *.txt
rm: remove zwykły plik `plik2.txt'? y
rm: remove zwykły plik `plik3.txt'? y
Jedną z bezpieczniejszych metod wykorzystania polecenia rm jest stosowanie opcji “-i” (jest ona
często domyślnie uaktywniona), w takim wypadku usunięcie każdego z plików wymaga
potwierdzenia (jak w powyższym przykładzie). Możemy ją jednak wyłączyć stosując “-f”, w takim
wypadku nie pojawią się pytania z prośbą o potwierdzenie kasowania.
$ ls
plik1.txt plik2.txt plik3.txt
$ rm -f plik2.txt plik3.txt
$ ls
plik1.txt
Możemy również dodać opcję “-r” oznaczającą rekursywne kasowanie zawartości podkatalogów. W
połączeniu z “-f” pozwala to usunąć katalog wraz z wszystkimi jego podkatalogami (oczywiście o
ile posiadamy odpowiednie prawa). Należy stosować te opcje bardzo uważnie (zmiany będą
nieodwracalne).
$ tree
.`
-- tmp
|-- plik1.txt
|-- plik2.txt
|-- plik3.txt
|-- tmp1
| |-- plik1.txt
12
| |-- plik2.txt
| `-- plik3.txt
|-- tmp2
| |-- plik1.txt
| |-- plik2.txt
| `-- plik3.txt
`-- tmp3
4 directories, 9 files
$ rm -fr tmp
$ tree
.
0 directories, 0 files
Jeszcze raz nale y podkre li - stosowanie rm powinno by ż ś ć ć dobrze przemyślane.
Polecenie mkdir
Polecenie mkdir (ang. make directory) służy do zakładania katalogów.
Jego najprostsze wykorzystanie pokazuje kolejny przykład:
$ mkdir tmp
$ ls
tmp/
Jedną z ciekawszych możliwości jest utworzenie całej struktury katalogów za pomocą
pojedynczego mkdir (wykorzystujemy do tego opcję “-p”).
$ ls
tmp/
$ mkdir -p tmp/tmp1/tmp2/tmp3
$ tree
.`
-- tmp
`-- tmp1
`-- tmp2
`-- tmp3
4 directories, 0 files
O ile nie dodalibyśmy “-p” polecenie zakończyłoby się niepowodzeniem.
$ tree
.
`-- tmp
`-- tmp1
`-- tmp2
`-- tmp3
4 directories, 0 files
$ mkdir tmp/tmp4/tmp5/tmp6
mkdir: nie można utworzyć katalogu `tmp/tmp4/tmp5/tmp6': No such file or
directory
Polecenie rmdir
Polecenie rmdir (ang. remove directory) służy do usuwania katalogów. Podobnie jak przy rm należy
13
go używać z uwagą.
Przykład użycia:
$ mkdir tmp7
$ ls
tmp/ tmp7/
$ rmdir tmp7
$ ls
tmp/
W przypadku, gdy katalog zawiera jakieś pliki lub katalogi wywołanie polecenia rmdir bez
dodatkowych opcji zakończy się niepowodzeniem.
$ tree
.`
-- tmp
`-- tmp1
`-- tmp2
`-- tmp3
4 directories, 0 files
$ rmdir tmp
rmdir: `tmp': Directory not empty
Właściwie jest to problem nie do rozwiązania za pomocą rmdir (pomijam rm z opcjami “-fr”).
Można co najwyżej zapoznać się z opcją “-p” i zobaczyć co to da.
Polecenie chown
Polecenie chown (ang. change owner) służy do zmieniania właściciela pliku. Oczywiście aby móc
zmieniać właściciela pliku, trzeba posiadać do niego odpowiednie prawa. Polecenie to może być
również wykorzystywane do zmiany grupy pliku (proszę zapoznać się z pomocą do tego polecenia i
prześledzić różne możliwości jego wykorzystania).
W systemach typu System V wszyscy użytkownicy będący właścicielami plików mogą zmieniać
właściciela pliku, w systemach z rodziny BSD takie działania są zarezerwowane wyłącznie dla
superużytkownika (root-a) [3].
Poniższe przykłady pokazują różne możliwości zamiany właściciela pliku z wykorzystaniem chown
(przykłady działają w przypadku użytkownika root, w pozostałych wypadkach ich działanie jest
uzależnione od wersji systemu):
# ls -l plik1.txt
-rw-r--r-- 1 student student 9 paź 7 12:43 plik1.txt
# chown root plik1.txt
# ls -l plik1.txt
-rw-r--r-- 1 root student 9 paź 7 12:43 plik1.txt
# chown student:root plik1.txt
# ls -l plik1.txt
-rw-r--r-- 1 student root 9 paź 7 12:43 plik1.txt
# chown root.root plik1.txt
# ls -l plik1.txt
-rw-r--r-- 1 root root 9 paź 7 12:43 plik1.txt
# chown :student plik1.txt
# ls -l plik1.txt
-rw-r--r-- 1 root student 9 paź 7 12:43 plik1.txt
14
# chown student plik1.txt
# ls -l plik1.txt
-rw-r--r-- 1 student student 9 pa ź 7 12:43 plik1.txt
Znak zachęty w postaci “#” oznacza pracę na koncie superużytkownika (root-a).
W przypadku zwykłego użytkownika operacja może się zakończyć niepowodzeniem:
$ chown root:root plik1.txt
chown: zmiana własciciela `plik1.txt': Operation not permitted
Polecenie chgrp
Polecenie chgrp (ang. change group) służy do zamiany grupy pliku. Podobnie jak w przypadku
chown, również to polecenie polega identycznym ograniczeniom w stosunku do użytkowników
mogących z niego korzystać.
Kolejne przykłady pokazują jego wykorzystanie:
# chgrp root plik1.txt
# ls -l plik1.txt
-rw-r--r-- 1 student root 9 paź 7 12:43 plik1.txt
# chgrp student plik1.txt
# ls -l plik1.txt
-rw-r--r-- 1 student student 9 paź 7 12:43 plik1.txt
Zwykły użytkownik może się spotkać z odmową wykonania polecenia:
$ chgrp root plik1.txt
chgrp: nie można zmienić grupy `plik1.txt': Operation not permitted
Polecenie chmod
Polecenie chmod (ang. change mode) służy do modyfikowania praw do plików i katalogów. Z jego
pomocą możemy określić kto będzie miał jakie prawa do tworzonych przez nas plików i katalogów.
Polecenie to może być wywoływane w bardzo różnorodny sposób, przedstawione w dalszej części
przykłady prezentują najczęściej wykorzystywane opcje, o pozostałych proszę sobie doczytać w
pliku manuala.
$ ls -l plik1.txt
-rw-r--r-- 1 student student 9 paź 7 12:43 plik1.txt
$ chmod u+rwx plik1.txt
$ ls -l plik1.txt
-rwxr--r-- 1 student student 9 paź 7 12:43 plik1.txt*
$ chmod u-x plik1.txt
$ ls -l plik1.txt
-rw-r--r-- 1 student student 9 paź 7 12:43 plik1.txt
$ chmod u=rx plik1.txt
$ ls -l plik1.txt
-r-xr--r-- 1 student student 9 paź 7 12:43 plik1.txt*
$ chmod u=rwx plik1.txt
$ ls -l plik1.txt
-rwxr--r-- 1 student student 9 paź 7 12:43 plik1.txt*
$ chmod u-rwx plik1.txt
$ ls -l plik1.txt
----r--r-- 1 student student 9 paź 7 12:43 plik1.txt
$ chmod u+rwx plik1.txt
15
$ ls -l plik1.txt
-rwxr--r-- 1 student student 9 pa ź 7 12:43 plik1.txt*
$ chmod g+rwx plik1.txt
$ ls -l plik1.txt
-rwxrwxr-- 1 student student 9 paź 7 12:43 plik1.txt*
$ chmod g-rw,o+rwx plik1.txt
$ ls -l plik1.txt
-rwx--xrwx 1 student student 9 paź 7 12:43 plik1.txt*
$ chmod u=rwx,g=,o= plik1.txt
$ ls -l plik1.txt
-rwx------ 1 student student 9 paź 7 12:43 plik1.txt*
$ chmod a=rx plik1.txt
$ ls -l plik1.txt
-r-xr-xr-x 1 student student 9 paź 7 12:43 plik1.txt*
$ chmod a-rx plik1.txt
$ ls -l plik1.txt
---------- 1 student student 9 paź 7 12:43 plik1.txt
$ chmod u=rw,g=r,o=, plik1.txt
$ ls -l plik1.txt
-rw-r----- 1 student student 9 paź 7 12:43 plik1.txt
Mam nadzieję, że analiza powyższych przykładów pozwoli Państwu poznać różnorodne metody
wywołania polecenia chmod.
Polecenie ln
Polecenie ln (ang. link) służy do tworzenia dowiązań symbolicznych do plików (twardych i
symbolicznych).
Poniżej kilka przykładów jego użycia.
Tworzenie twardych dowiązań do pliku “plik1.txt” pod nazwami “plik2.txt” i “plik3.txt” (proszę
zwrócić uwagę na drugą kolumnę wyświetlaną przez ls - zawiera ona liczbę dowiązań do pliku):
$ ls -l
razem 4
-rw-r--r-- 1 student student 9 paź 11 19:45 plik1.txt
$ cat plik1.txt
PIERWSZY
$ ln plik1.txt plik2.txt
$ ls -l
razem 8
-rw-r--r-- 2 student student 9 paź 11 19:45 plik1.txt
-rw-r--r-- 2 student student 9 paź 11 19:45 plik2.txt
$ cat plik2.txt
PIERWSZY
$ ln plik1.txt plik3.txt
$ ls -l
razem 12
-rw-r--r-- 3 student student 9 paź 11 19:45 plik1.txt
-rw-r--r-- 3 student student 9 paź 11 19:45 plik2.txt
-rw-r--r-- 3 student student 9 paź 11 19:45 plik3.txt
$ rm plik1.txt
$ ls -l
razem 8
-rw-r--r-- 2 student student 9 paź 11 19:45 plik2.txt
-rw-r--r-- 2 student student 9 paź 11 19:45 plik3.txt
$ cat plik3.txt
PIERWSZY
$ rm plik2.txt
$ ls -l
16
razem 4
-rw-r--r-- 1 student student 9 pa ź 11 19:45 plik3.txt
$ ln plik3.txt plik1.txt
$ ls -l
razem 8
-rw-r--r-- 2 student student 9 paź 11 19:45 plik1.txt
-rw-r--r-- 2 student student 9 paź 11 19:45 plik3.txt
$ cat plik1.txt
PIERWSZY
$ > plik3.txt
$ cat plik3.txt
$ cat plik1.txt
$ ls -l
razem 0
-rw-r--r-- 2 student student 0 paź 11 19:52 plik1.txt
-rw-r--r-- 2 student student 0 paź 11 19:52 plik3.txt
Jak widać twarde linki są wyświetlane tak samo jak zwykłe pliki i nie są w żaden sposób
rozróżnialne. Dodatkowo zmiana zawartości jednego z plików pociąga za sobą zmianę zawartości
drugiego (gdyż tak naprawdę to jeden i ten sam plik widoczny pod kilkoma różnymi nazwami).
Kolejny przykład pokazuje tworzenie linków symbolicznych:
$ ls -l
razem 4
-rw-r--r-- 1 student student 9 paź 11 19:56 plik1.txt
$ ln -s plik1.txt plik2.txt
$ ls -l
razem 4
-rw-r--r-- 1 student student 9 paź 11 19:56 plik1.txt
lrwxrwxrwx 1 student student 9 paź 11 19:56 plik2.txt -> plik1.txt
$ ln -s plik1.txt plik3.txt
$ ls -l
razem 4
-rw-r--r-- 1 student student 9 paź 11 19:56 plik1.txt
lrwxrwxrwx 1 student student 9 paź 11 19:56 plik2.txt -> plik1.txt
lrwxrwxrwx 1 student student 9 paź 11 19:57 plik3.txt -> plik1.txt
$ cat plik1.txt
PIERWSZY
$ cat plik2.txt
PIERWSZY
$ rm plik1.txt
rm: remove zwykły plik `plik1.txt'? y
$ ls -l
razem 0
lrwxrwxrwx 1 student student 9 paź 11 19:56 plik2.txt -> plik1.txt
lrwxrwxrwx 1 student student 9 paź 11 19:57 plik3.txt -> plik1.txt
$ cat plik2.txt
cat: plik2.txt: No such file or directory
Jak widać linki symboliczne są jedynie skrótami, co znajduje swoje odzwierciedlenie w sposobie
ich wyświetlania przez polecenie ls (typ pliku to w tym przypadku “l”, dodatkowo pojawia się
informacja w rodzaju “nazwa_linku -> nazwa_pliku_na_który_wskazuje”). W przypadku usunięcia
pliku na które wskazują linki symboliczne, po wyświetleniu zawartości katalogu z pomocą ls, takie
nie wskazujące już na nic skróty są dodatkowo zaznaczane.
Program mc
Program mc (ang. Midnight Commander) stanowi Linux-owy odpowiednik popularnych w systemie
DOS menedżerów plików. Można go porównywać z “Norton Commander-em”, “DOS Navigator-
17
em”, czy te dzia aj cym pod Windows “Windows Commander-em” (obecnie ż ł ą “Total Commanderem”).
Opanowanie jego obsługi może znacznie przyśpieszyć Państwa pracę z plikami, jakkolwiek
żaden szanujący się administrator systemu UNIX nie nazwałby takiego podejścia profesjonalnym
(nie wspominając o znacznie mniejszej funkcjonalności programu w porównaniu z poleceniami
systemu UNIX).
Więcej informacji o wymienionych poleceniach odnajdziecie Państwo w odpowiednich
podręcznikach man (polskie tłumaczenia części z nich stanowią załącznik do tego dokumentu).
Powyższe informacje powinny Państwu wystarczyć do rozwiązania załączonej listy zadań.