Żeby się poruszać po wspomnianym systemie, trzeba najpierw nieco o nim
wiedzieć. W linuksie nie ma czegoś takiego, jak dysk C: czy A:. Są tylko
katalogi (pod Windows to się nazywa foldery, ale Microsoft jest odosobniony
w używaniu tej nazwy). Wszystkie katalogi są podkatalogami katalogu głównego,
zwanego root (korzeń), oznaczanego przez /, wyżej już wejść się nie da.
Natomiast da się wejść niżej, najczęściej do etc, boot, bin, dev, home,
lib, proc i innych podobnych. Każdy z katalogów w katalogu głównym
(czyli jego podkatalogów) może zawierać inne katalogi (swoje podkatalogi),
więc jakoś trzeba je oddzielać. Do tego w Windows służył backslash (\). Pod
un*xami jest to (forward)slash - /.
Teraz przyszła pora na parę słów o komendzie cd. Polecenie cd
/usr/local przeniesie cię do katalogu /usr/local. Jeśli
jesteś w katalogu /, to równie dobrze mógłbyś wydać polecenie
cd usr/local - różni się od poprzedniego tym, że nie ma pierwszego
slasha. Różnica w działaniu jest taka, że pierwsze polecenie przeniesie cię do
katalogu /usr/local niezależnie od tego, gdzie się znajdowałeś,
a drugie - tylko w wypadku, gdy byłeś w katalogu /. W pierwszym poleceniu
użyłeś tzw. ścieżki bezwzględnej, odnoszącej się do katalogu głównego, którego
położenie jest stałe i niezmienne. W drugim wypadku polecenie zostało
odczytane w ten sposób: w bieżącym katalogu jest katalog usr,
a w nim local. To była ścieżka względna, odnosząca się do
bieżącego katalogu. Gdybyś był w innym katalogu, na pewno nie znalazłbyś się
w /usr/local.
W każdym katalogu są co najmniej dwa katalogi: . (kropka) oraz .. (dwie
kropki) Katalog <dwie kropki> symbolizuje katalog nadrzędny (czyli
o jeden poziom wyżej). Powiedzmy, że jesteś w /usr/local. Żeby
przejść do /usr możesz wpisać albo cd /usr, albo
cd .. Ta druga metoda jest wygodniejsza (przy przechodzeniu do
katalogu wyżej), bo krótsza. Rzecz jasna nadkatalog też ma katalog <dwie
kropki>, dzięki czemu jeśli jesteś w /usr/man/man8 i chcesz
się dostać do /usr, możesz wpisać cd ../..
Wspomniałem o katalogu <kropka>. Ten symbolizuje katalog aktualny,
bieżący. Przy chodzeniu po drzewie katalogów raczej się go nie używa, jego
zastosowanie poznasz za chwilę.
Łażenie po systemie plików może spowodować, że pogubisz się, gdzie jesteś.
W zależności od paru ustawień, możesz mieć wyświetlaną ścieżkę, gdzie
aktualnie się znajdujesz, albo nie. Jak by nie było, jest komenda, która
podaje pełną ścieżkę do aktualnego katalogu: pwd (od słów Print
Working Directory). Nie jest ono zbyt skomplikowane, po prostu wpisujesz
pwd i zatwierdzasz. Żadnych dodatkowych argumentów.
Chodzenie po katalogach to nie wszystko. Dobrze byłoby wiedzieć, co się
znajduje w bieżącym katalogu (czyli gdzie można iść). Do tego służy polecenie
ls (nie i-es, a el-es). Jeśli wpiszesz po prostu ls, to
wyświetli się lista rzeczy, jakie są w bieżącym katalogu. Gdy wpiszesz ls
-l (ls -<małe-L>), dostaniesz znacznie więcej informacji. Gdy
dodasz --color, dostaniesz wydruk kolorowy: katalogi na
ciemnoniebiesko, pliki zwykłe na zwyczajnie, obrazy
(jpeg/gif/tiff/bmp/inne-tego-typu) na fioletowo, archiwa na czerwono, pliki
wykonywalne na zielono itd. (uwaga: możliwe, że samo polecenie ls
dało wydruk kolorowy, to zależy od konfiguracji systemu) Polecenie to ma
znacznie więcej opcji przydatnych w różnych sytuacjach, spis wszystkich
dostaniesz po wydaniu polecenia ls --help (notabene
--help jest ogólnie przyjętym w linuksie przełącznikiem dla pomocy
podręcznej). Ja sam używam ls -s -h -C -F --color, gdzie
-s odpowiada za wyświetlanie rozmiarów plików, -h za
rozmiary czytelne dla człowieka (nie bloki, a kilobajty), -C
sortuje wydruk w kolumnach, -F zaś dołącza odpowiedni znaczek za
nazwą pliku w zależności od jego właściwości. Drobna uwaga: przełączniki
najczęściej można łączyć i podawać w dowolnej kolejności, tak więc moje
polecenie wygląda tak: ls -hsCF --color (tych długich,
zaczynających się od -- nie można łączyć).
Wiesz jak wylistować katalog bieżący. Żeby wylistować katalog inny niż
aktualny musisz podać jego położenie. Wpisując ls /usr wypiszesz
zawartość katalogu /usr (niezależnie od tego, czy w nim byłeś,
czy byłeś całkiem gdzie indziej). Jeśli jesteś, powiedzmy, w katalogu
/usr i chcesz wypisać zawartość katalogu man, wpisz
ls man. Zwróć uwagę na brak slasha przed man. Takie
polecenie mówi, że w aktualnym katalogu jest coś zwące się man
i ls ma to wylistować. Oczywiście ls .. wypisze
zawartość katalogu nadrzędnego.
Podsumowując względność ścieżek, ścieżka bezwzględna to ścieżka zawsze do tego
samego katalogu, niezależnie od bieżącego położenia. Wszystko, co zaczyna się
od slasha, jest ścieżką bezwzględną. Pozostałe rzeczy to ścieżki względne,
odnoszące się do bieżącego katalogu, zwanego roboczym, np.
../test to ścieżka do katalogu o nazwie test będącego "sąsiadem"
bieżącego katalogu.
Jeszcze jeden przydatny przełącznik, -d, listuje nazwy katalogów
zamiast ich zawartości. Polecenie ls -d /etc wypisze samo
/etc. To się przydaje wtedy, gdy podajesz maskę plików, która pasuje
do jakiegoś katalogu (co to jest maska wyjaśnione jest niżej)
Pora teraz na nieco komend do zarządzania plikami. Na początek kopiowanie. Do
tego służy polecenie cp. W zasadzie większa część zastosowania
sprowadza się do trzech-czterech sytuacji. Kopiowanie jeden_plik ->
nowa_nazwa odbywa się za pomocą cp nazwa-pliku-źródłowego
nazwa-pliku-docelowego (jeśli w nazwie któregokolwiek pliku występuje
spacja, należy tę nazwę ująć w cudzysłów podwójny " lub pojedynczy ' [pod tym
samym klawiszem], na naszym etapie nie robią różnicy). W ten sposób możesz
skopiować plik do tego samego katalogu pod inną nazwę, np. cp stary-plik
nowa-nazwa-na-kopię. Kopiowanie jeden_plik ->
nowe_miejsce_położenia odbywa się w ten sam sposób, przy czym drugi
argument (miejsce docelowe) musi być katalogiem: cp /etc/passwd
/tmp skopiuje plik /etc/passwd do katalogu
/tmp, tzn. w /tmp będzie plik passwd.
Można jeszcze kopiować wiele plików na raz, wtedy podajesz nazwy plików
oddzielane od siebie spacją/tabem/paroma-takimi, a na końcu podajesz
istniejący katalog, do którego będą skopiowane. Oczywiście możesz
podać ścieżkę względną do wszystkiego, np. cp /etc/passwd ..
skopiuje plik passwd z katalogu /etc do katalogu
nadrzędnego w stosunku do aktualnego (oczywiście o ile masz uprawnienia do
zapisu w katalogu nadrzędnym).
Kopiowanie wielu plików na raz jest wygodne, bo nie trzeba piętnaście razy
wpisywać tego samego polecenia. Chociaż z drugiej strony, wpisać dwadzieścia
nazw plików też jest męczące. Po to wymyślono 'wildcards', czyli znaki
maskujące (mają różne polskie nazwy, ja będę chyba stosował angielską). Takie
maski są bardzo podobne do DOSowych, "????.???" dopasuje wszystkie pliki
o nazwie <cztery znaki, kropka, trzy znaki>. Zauważ, że nie użyłem
określenia rozszerzenie. Oznacza to, że kropka jest traktowana
identyczne jak inne litery (a często nawet nie jest stosowana). Zatem maska
pasująca wszystkie pliki nie wygląda tak, jak w DOSie (*.*). ale jest to
pojedyncza gwiazdka. Podstawmy teraz maskę do polecenia (jesteś, powiedzmy,
w /usr): cp ../etc/profile.d/* ../tmp skopiuje
wszystkie pliki z katalogu o jeden wyżej, tam w etc jest katalog
profile.d (czyli /etc/profile, dla
/usr nadrzędny jest katalog główny) do katalogu o jeden wyżej
i do tmp.
Teraz przyda się katalog <kropka>. Jeśli chcesz skopiować cokolwiek do
katalogu aktualnego, wpisz to: cp /etc/passwd . Na końcu polecenia
pojawiła się pojedyncza kropka. Polecenie to mówi, żeby system wziął plik
/etc/passwd i skopiował do katalogu aktualnego. Może jeszcze
jeden przykład: cp /etc/passwd ./test skopiuje plik
/etc/passwd do aktualnego katalogu i nada mu nazwę
test (chyba że miałeś katalog o tej nazwie, wtedy plik zostanie
skopiowany do tego katalogu pod starą nazwę). To polecenie jest idealnie
równoznaczne z poleceniem cp /etc/passwd test, jeśli masz zamiar
podać cokolwiek więcej niż sam katalog aktualny (na przykład podkatalog
katalogu aktualnego), to możesz pominąć kropkę ze slashem. Domyślnie, jeśli
nie podałeś ścieżki bezwzględnej, to będzie to miejsce w katalogu aktualnym.
Jeśli jednak kopiujesz coś do katalogu aktualnego, to musisz podać kropkę, nie
możesz jej pominąć, bo wtedy nie podasz nic, więc system nie będzie wiedział,
dokąd ma to skopiować.
Jeszcze kopiowanie całych katalogów. Domyślnym zachowaniem polecenia
cp jest kopiowanie plików, a pomijanie katalogów. Żeby skopiować
cały katalog wraz z podkatalogami, musisz podać dodatkowy parametr: cp -R
/etc/rc.d /tmp skopiuje cały katalog /etc/rc.d do katalogu
/tmp, gdzie pojawi się katalog rc.d. Zauważ, że
polecenie cp /etc/rc.d/* /tmp skopiuje jedynie pliki
z katalogu /etc/rc.d, a cp -R /etc/rc.d /tmp skopiuje
cały katalog.
Drobna uwaga: cp nie zapyta się ciebie, czy chcesz nadpisać
docelowe pliki (jeśli wcześniej istniały). Od razu je nadpisze. Oczywiście na
to jest sposób, wystarczy dodać przełącznik -i, otrzymując cp
-i coś cel
Teraz pora na polecenie mv. Składnia praktycznie taka sama, jak
przy cp: mv co gdzie. Tu już nie trzeba dodawać
-R, żeby przenieść cały katalog. Wystarczy go po prostu podać.
Natomiast -i nadal działa.
Jeszcze usuwanie plików: rm co-mam-usunąć. Można podać parę plików:
rm jeden_plik drugi_plik /tmp/test/plik_testowy
../plik-w-katalogu-wyżej, albo nawet maskę rm * (do tej maski
podpasują wszystkie pliki/katalogi z katalogu aktualnego). Polecenie
rm standardowo nie usuwa katalogów, żeby to robiło, należy dodać
przełącznik -R (w zasadzie -r tutaj zadziała
identycznie, ale -R jest szerzej używane w poleceniach, łatwiej je
zapamiętać). Tak więc rm -R jakiś-katalog usunie
jakiś-katalog wraz z podkatalogami.
Ale, ale, jeszcze nie podałem komend zakładania i usuwania katalogów. Oba
polecenia operują na pustych katalogach: mkdir zakłada
pusty katalog, rmdir usuwa pusty katalog (rmdir nie
potrafi usunąć katalogu z podkatalogami czy jakimiś plikami, w przeciwieństwie
do rm -R). Oba polecenia potrafią zakładać/usuwać kilka katalogów
na raz: mkdir a b c inny-katalog założy w aktualnym katalogu
podkatalogi o nazwach a, b, c oraz inny-katalog. Analogicznie
rmdir.
Jeszcze zostały katalogi i pliki ze spacjami i innymi dziwnymi znaczkami
w nazwach. Żeby się dobrać do katalogu katalog z duza iloscia
spacji (mam na myśli wejście) wpisz
cd "katalog z duza iloscia spacji". Chyba
niezbyt skomplikowane, nie? Możesz jeszcze spróbować inną metodą (preferowaną
przez basha przy dopełnianiu nazw) jest wyeskejpowanie spacji. Ciągi typu
\n czy \t są nazywane sekwencjami escape'owymi, stąd nazwa.
A chodzi o to, że przed spacją wstawiasz backslash i już się o nic nie
martwisz
(cd katalog\ z\ duza\ iloscia\ spacji).
Ograniczać w ten sposób musisz nie tylko spacje, ale i znaczki typu
' " [ ] { } ( ) * & $ # ! < > \ | ? Najogólniej działa
wyeskejpowanie, ujęcie w cudzysłów natomiast już nie działa na wszystko. Ale
raczej nie będziesz tworzyć nazw z takimi kosmicznymi znaczkami, bo to tylko
utrudnia dostęp i stwarza niekiedy problemy przy kopiowaniu plików na inne
systemy plików (głównie FAT12/16/32).
Dobra, podstawy już są. Teraz pewien trick: w bashu możesz dopełniać nazwy nie wpisując ich całkowicie. Wpisz cp /usr/lo[tab], gdzie [tab] oznacza wciśnięcie klawisza Tab. Bash powinien dopełnić nazwę katalogu do /usr/local/. Jeśli nie dopełnił, wciśnij [tab] ponownie, dostaniesz listę możliwych dopełnień, a jeśli nie ma listy - to nie masz katalogu zaczynającego się na te litery. Bash dopełnia tyle, ile może. Jeśli w aktualnym katalogu masz pliki local, locale, locate list-do-cioci, latawiec, koszyk-z-jagodami, to cp [tab] nie dopełni nic. Ponowne wciśnięcie [tab] wypisze wszystkie pliki. Jeśli wpiszesz cp l[tab], to również nic nie dostaniesz, ale ponowne wciśnięcie [tab] nie wypisze już pliku koszyk-z-jagodami (bo nie zaczyna się na 'l'). A jak wpiszesz cp lo[tab], to dostaniesz cp loca, bo pliki zaczynające się na lo mają dalej ten sam fragment ca. Na tym się bash zatrzyma, bo dalej już pliki się różnią, a bash nie wie, o który ci chodzi. Teraz wciśnięcie klawisza [tab] wypisze pliki local, locale, locate. Dopiszesz literkę t i wciśniesz [tab], a wtedy dopełnisz nazwę pliku do locate. Chyba już kapujesz, jak się upraszcza wpisywanie komend w linii poleceń?
Pozostała jeszcze sprawa plików kropkowych. Taki plik ma nazwę zaczynającą się od kropki, i przeważnie nie jest widoczny (przede wszystkim zwykła komenda ls nie wypisuje tego, poza tym rozwijanie gwiazdek opisane dalej nie trafia na takie pliki bez specjalnej zachęty w postaci kropki przed maską). Najczęściej w takich plikach czy katalogach znajdują się ustawienia programów, na przykład .bashrc w twoim katalogu domowym zawiera parę ustawień powłoki bash (co jest opisane w innym miejscu). Nazwy takich plików z reguły są normalnie dopełniane, a listowanie takich plików to dodanie jedynie opcji -A albo -a do ls (ls -a wypisze wszystkie pliki i katalogi, włącznie z . i .., ls -A zaś pominie te dwa)