Katalogi

W Unixie, tak jak w prawie każdym współczesnym systemie operacyjnym, dane użytkowników przechowywane są na dysku w postaci plików. Pliki mogą zawierać dowolny rodzaj informacji: teksty, kody programów, dane i informacje sterujące dla tych programów itp. Każdy plik posiada nazwę, która może składać się z liter, cyfr, znaku podkreślenia i kropki. Możliwe jest także użycie innych znaków specjalnych, ale lepiej tego unikać.

Mechanizm obsługujący przechowywanie plików na dyskach nosi nazwę systemu plikowego. Przy niewielkiej ilości plików system plikowy mógłby być zbiorem nazwanych plików zapisanych na dysku. Ponieważ jednak plików może być bardzo dużo, pogrupowane są one w katalogi.

Katalog jest to po prostu zbiór plików. Podobnie jak plik, katalog posiada nazwę. Zwykle pliki są grupowane w katalogi według ich zawartości. W typowym przedsiębiorstwie możemy mieć pliki zawierające różne rodzaje dokumentów. Można umieścić w osobnym katalogu pliki zawierające opisy produktów, w innym korespondencję z klientami itp.

Oprócz plików katalog może także zawierać swoje katalogi podrzędne. Katalogi zawarte w danym katalogu nazywamy jego podkatalogami. Jeśli plików jest dużo, to warto na przykład katalogi opisujące dokumenty warto umieścić we wspólnym katalogu dokumenty. Otrzymamy wtedy taką strukturę jak poniżej.

                   dokumenty
                       |
         +-------------+-------------+
         |                           |
      produkty                     listy
         |                           |
   +-----+-----+               +-----+-----+
   |           |               |           |
szczotka     szufla        oferta.15     odp.4

Inna grupa katalogów może zawierać programy.

         programy
            |
  +---------+---------+
  |         |         |
kadry     edytor     druk

Obie te struktury można umieścić we wspólnym katalogu firma.

                           firma   
                             |
            +----------------+----------------+   
            |                                 |
         programy                         dokumenty    
            |                                 |
  +---------+---------+         +-------------+-------------+
  |         |         |         |                           |
kadry     edytor     druk    produkty                     listy
                                |                           |
                          +-----+-----+               +-----+-----+
                          |           |               |           |
                       szczotka     szufla        oferta.15     odp.4

Podsumujmy. Plik jest to wydzielona, nazwana porcja informacji, przechowywana na dysku. Katalog jest zbiorem plików i podkatalogów (w rzeczywistości jest to również plik, tyle że zawierający wykaz nazw plików i katalogów w nim zawartych).

Wszystkie katalogi w systemie Unix tworzą strukturę drzewa. Katalog będący podstawą (korzeniem) tego drzewa jest wyróżniony i nazywany katalogiem głównym. Nie jest on zawarty w żadnym innym katalogu, natomiast wszystkie inne pliki i katalogi są zawarte w nim lub w jego podkatalogach. Katalog główny zapisywany jest jako

/

Ponieważ w różnych katalogach mogą wystąpić pliki o tej samej nazwie, plik identyfikowany jest jednoznacznie nazwą rozszerzoną zwaną ścieżką. Ścieżkę tworzymy poprzedzając nazwę pliku nazwami kolejnych katalogów obejmujących go, poczynając od katalogu głównego, a kończąc na katalogu bezpośrednio zawierającym plik. Nazwy katalogów w ścieżce oddzielamy ukośną kreską.

Niech na przykład katalog główny zawiera podkatalog home (jest to systemowy katalog, którego podkatalogami są katalogi robocze użytkowników), ten zaś podkatalog dobo. Ścieżką dla pliku ala z katalogu dobo będzie

/home/dobo/ala

Katalog bieżący, inne katalogi

W każdym momencie sesji użytkownika jeden z katalogów stanowi jego katalog bieżący. Oznacza to, że wszystkie operacje na plikach będą domyślnie (tzn. o ile nie podamy jawnie inaczej) odnosiły się do tego katalogu. Na początku sesji katalogiem bieżącym jest zwykle katalog macierzysty użytkownika. Każdy użytkownik posiada taki katalog. Nazwę bieżącego katalogu można poznać używając polecenia pwd (od ang. print working directory).

$ pwd
/home/student1
$ _

Zawartość bieżącego katalogu (tzn. wykaz nazw plików i katalogów w nim zawartych) można uzyskać poleceniem ls (od ang. list).

$ ls
$ _

Jeśli jesteśmy nowym użytkownikiem, to nasz katalog macierzysty (tak jak w powyższym przypadku) będzie pusty. Zanim założymy w nim jakieś pliki spróbujmy pooglądać inne katalogi. Jeden ze sposobów to posłużenie się poleceniem ls z argumentem. Argument powinien być nazwą (najlepiej ścieżką) katalogu, którego zawartość chcemy obejrzeć.

$ ls /home
nauczyciel
student1
student2
student3
student4
student5
student6
student7
$ _

Zmiana bieżącego katalogu

Drugi sposób to zmienić katalog bieżący. Czynimy to komendą cd, podając jako jej argument nazwę katalogu, który chcemy uczynić bieżącym.

$ cd /home
$ pwd
/home
$ ls -x
nauczyciel  student1   student2   student3   student4  
student5    student6   student7
$ _

W powyższym poleceniu ls użyliśmy opcji -x. Opcje to specjalna postać argumentów, rozpoczynająca się od kreski, po której najczęściej występuje pojedynczy znak. Stanowi on nazwę opcji. Po opcji może dodatkowo wystąpić jej argument. Wszystkie opcje powinny wystąpić na początku listy argumentów polecenia.

Opcja -x polecenia ls powoduje wielokolumnowe wyświetlanie zawartości katalogu. Wróćmy jednak teraz do naszego macierzystego katalogu.

$ cd student1
$ pwd
/home/student1
$ _

Tym razem jako argumentu dla polecenia cd użyliśmy nie ścieżki, lecz po prostu nazwy podkatalogu. Można tak zrobić tylko wtedy, gdy ten podkatalog zawarty jest (bezpośrednio) w katalogu bieżącym. System widząc nazwę, która nie rozpoczyna się ukośnikiem zakłada, że nazwa ta zawarta jest w katalogu bieżącym.

Do katalogu zawierającego katalog bieżący można przejść używając także umownej nazwy .. jako argumentu.

$ pwd
/home/student1
$ cd ..
$ pwd
/home
$ cd ..
$ pwd
/
$ _

I tak znaleźliśmy się w katalogu głównym systemu. Pora wrócić do katalogu macierzystego. Moglibyśmy teraz użyć jego ścieżki jako argumentu dla cd, zrobimy jednak inaczej.

$ pwd
/
$ cd
$ pwd
/home/student1
$ _

Polecenie cd wywołane bez argumentu używa argumentu domyślnego --- macierzystego katalogu użytkownika. A właśnie o to nam chodziło.

Zakładanie katalogów

Jak już mówiliśmy, każdy użytkownik posiada własny katalog macierzysty. W nim będą umieszczane jego pliki. Przy większej liczbie plików operowanie takim katalogiem jest niewygodne. Warto wtedy założyć dodatkowe katalogi i pogrupować w nich pliki stosownie do ich zawartości i przeznaczenia.

Katalogi użytkownika mogą być tworzone tylko jako podkatalogi jego katalogu macierzystego. Służy do tego polecenie mkdir (od ang. make directory). Argumentem jest nazwa tworzonego katalogu. Utworzymy teraz katalog, w którym w przyszłości trzymać będziemy zapasowe kopie plików.

$ pwd
/home/student1
$ mkdir archiwum
$ ls
archiwum
$ _

Utworzony katalog stał się podkatalogiem katalogu bieżącego i jest na razie pusty.

$ cd archiwum
$ ls
$ pwd
/home/student1/archiwum
$ cd ..
$ pwd
/home/student1
$ _

Utworzymy teraz jeszcze jeden katalog, potrzebny nam tylko na chwilę.

$ mkdir na.chwilę
$ ls
archiwum
na.chwilę
$ _

Teraz katalog /home/student1 zawiera dwa podkatalogi (oba puste).

$ cd na.chwilę
$ cat na.moment
To jest plik roboczy.
^D
$ ls
na.moment
$ _

Usuwanie katalogów

Pora zająć się usuwaniem katalogów. Spróbujmy usunąć katalog na.chwile. Nie można tego uczynić poleceniem rm.

$ rm na.chwilę
rm: na.chwile is a directory
$ ls
archiwum
na.chwilę
postacie
przybysze
wszyscy
$ _

Usuwać katalogi należy poleceniem rmdir (od ang. remove directory).

$ rmdir na.chwilę
rmdir: na.chwile: Directory not empty
$ ls
na.chwilę
archiwum
postacie
przybysze
wszyscy
$ _

Znowu się nie udało, ale tym razem wybraliśmy już poprawne polecenie. Nie wolno jednak usuwać niepustego katalogu, tzn. zawierającego jakieś pliki. Musimy najpierw usunąć wszystkie pliki z katalogu na.chwile. Możemy to zrobić poleceniem rm.

$ cd na.chwilę
$ ls
na.moment
$ rm na.moment
$ cd ..
$ rmdir na.chwilę
$ ls
archiwum
$ _

Przenoszenie plików

Trzymanie zapasowych kopii plików w katalogu roboczym nie jest dobrym pomysłem. Zbyt łatwo można przez nieuwagę usunąć je. Prawdziwe archiwa trzymane są na wymiennych nośnikach informacji, takich jak taśmy magnetyczne, dyski wymienne czy w najprostszym przypadku dyskietki. My jednak na razie stworzymy archiwum w osobnym katalogu.

Podczas tej lekcji stworzyliśmy do tego celu osobny katalog. Na razie jest on pusty.

$ cd archiwum
$ ls
$ pwd
/home/student1/archiwum
$ cd ..
$ pwd
/home/student1
$ _

Przeniesiemy teraz do niego nasze zapasowe pliki. Moglibyśmy to zrobić kopiując je, a następnie usuwając z katalogu macierzystego. Wygodniej jednak będzie skorzystać z polecenia mv. Polecenie to przeznaczone jest do przenoszenia plików w ramach struktury katalogów. Przeniesienie takie wiąże się ze zmianą nazwy pliku, przez którą uzyskujemy do niego dostęp.

$ mv postacie.kop archiwum
$ ls
archiwum
postacie
przybysze
wszyscy
wszyscy.kop
$ ls archiwum
postacie.kop
$ _

Tym razem jako drugiego argumentu polecenia mv użyliśmy nazwy istniejącego katalogu. Plik został więc przeniesiony do tego katalogu.

Aby umieścić plik w innym katalogu zamiast nazwy katalogu możemy także użyć ścieżki względnej, podającej nową nazwę przenoszonego pliku. Taka ścieżka nie rozpoczyna się ukośnikiem, nie prowadzi więc od katalogu głównego, lecz od katalogu bieżącego. Podobnie jak w zwykłej ścieżce, katalogi w ścieżce względnej oddzielane są ukośnikami.

$ mv wszyscy.kop archiwum/wszyscy.kop
$ ls
archiwum
postacie
przybysze
wszyscy
$ ls archiwum
postacie.kop
wszyscy.kop
$ _

W tym przypadku użycie ścieżki względnej było mniej wygodne, niż użycie katalogu. Popatrzmy jednak na następny przykład.

$ cp przybysze archiwum/przybysze.kop
$ ls
archiwum
postacie
przybysze
wszyscy
$ ls archiwum
postacie.kop
przybysze.kop
wszyscy.kop
$ _

Skopiowaliśmy plik przybysze do innego katalogu, równocześnie zmieniając mu nazwę na przybysze.kop.

Przenieśmy te pliki z powrotem do bieżącego katalogu. Poznaliśmy już wersję polecenia mv, w której drugi argument jest katalogiem. Skorzystajmy z niej. Powstaje jednak pytanie, jak podać katalog docelowy. Jest nim przecież katalog bieżący. Można oczywiście podać jego ścieżkę, ale znacznie wygodniej jest użyć jego nazwy umownej. Nazwa umowną katalogu bieżącego składa się z pojedynczej kropki.

$ mv archiwum/postacie.kop .
$ ls archiwum
przybysze.kop
wszyscy.kop
$ ls
archiwum
postacie
postacie.kop
przybysze
wszyscy
$ _

Jednym poleceniem mv możemy przenieść kilka plików pod warunkiem, że ostatni argument jest nazwą katalogu docelowego. Wszystkie podane przed nim pliki zostaną do niego przeniesione. Podobna zasada obowiązuje dla polecenia cp.

$ mv archiwum/przybysze.kop archiwum/wszyscy.kop .
$ ls
archiwum
postacie
postacie.kop
przybysze
przybysze.kop
wszyscy
wszyscy.kop
$ ls archiwum
$ _

Teraz już możemy usunąc katalog archiwum.

$ rmdir archiwum
$ ls
postacie
postacie.kop
przybysze
przybysze.kop
wszyscy
wszyscy.kop
$ _

Usuniemy teraz zbędne kopie. Moglibyśmy podać je wszystkie jako argumenty polecenia rm. Przy większej liczbie plików do usunięcia byłoby to jednak niewygodne. Użyjemy wzorca, co wprowadzi nas w tematykę następnej lekcji.

$ rm *.kop
$ ls
postacie
przybysze
wszyscy
$ _

Polecenie rm wybrało wszystkie pliki, których nazwy były zgodne z podanym wzorcem. Wzorzec ten pasuje do wszelkich nazw kończących się znakami .kop (także do nazwy .kop, ale to zupełnie inna historia).