Command Line – Chapter II

Zarządzanie, modyfikowanie, tworzenie i usuwanie katalogów oraz plików

 
 
 
W systemie GNU/Linux zaimplementowano hierarchiczną (drzewiastą) strukturę katalogów, która jest dość ściśle określona wg FHS (Filesystem Hierarchy Standard). Dzięki takiemu podejściu można utworzyć tyle katalogów, ile potrzeba do pogrupowania plików w naturalny sposób. Dodatkowo każdy użytkownik może mieć swój prywatny katalog przeznaczony na własną hierarchię. Jednym z trudniejszych punktów do obycia dla początkującego użytkownika Linuksa jest to, gdzie są przechowywane rzeczy w systemie, poniższa lista w skrócie przedstawia strukturę katalogów:

/ – główny katalog
|_ bin – pliki wykonywalne
|_ boot – pliki ładujące system
|_ dev – pliki urządzeń
|_ etc – pliki konfiguracyjne
|_ lib – biblioteki dzielone i moduły jądra
|_ mnt – punkt montowania systemów plików
|_ opt – pakiety zainstalowane opcjonalnie
|_ sbin – pliki wykonywalne (dla administratorów)
|_ tmp – pliki tymczasowe
|_ usr – narzędzia i aplikacje
|_ var – zmieniające się dane

/home – Jest to prawdopodobnie najbardziej znany katalog. W katalogu /home domyślnie znajdują się katalogi nazwane od kont użytkowiników systemu (wyjątkiem jest root). Przykładowo /home/mk to katalog domowy użytkownika o nazwie mk, w którym ma prawo zapisywać, kasować i odczytywać. Gdyby na komputerze było 10 innych użytkowników, ich katalogi znalazłyby się także w /home. Domyślnie inni użytkownicy nie mieliby do nich dostępu.

/bin – w tym katalogu znajdują się co ważniejsze binaria, niezbędne do działania systemu.

/boot – katalog zawiera pliki potrzebne do uruchomienia systemu, takie jak konfigurację GRUB, obrazki ładowane jako podkład do menu wyboru systemu…

/dev – tutaj umiejscowione są pliki reprezentujące urządzenia, takie jak hda, sda. Za istnienie tych plików odpowiada mechanizm udev, który na bieżąco dostosowuje zawartość /dev do aktualnie podłączonych urządzeń.

/etc – to zapis konfiguracji systemu. Pliki startowe, konfiguracja sieci, menedżera pakietów, zabezpieczeń…

/lib – Podobnie jak /bin, co ważniejsze biblioteki.

/mnt – W odróżnieniu od /media, /mnt przechowuje obrazy zamontowanych partycji na dyskach niewymiennych i jest przeznaczony do ręcznego użycia przez użytkownika. Dziś obserwuje się nieprawidłowe użycie zarówno /media jak i /mnt, głównie dlatego, że zwykle nie ma wielkiego znaczenia gdzie co jest zamontowane.

/opt – To katalog jak /usr, ale przeznaczony do instalacji zupełnie opcjonalnych programów. Powinno się tam instalować OpenOffice, Javę, vagrant, VSC i niektóre serwery.

/sbin – Najważniejsze programy, niezbędne do uruchomienia i prawidłowego działania systemu.

/tmp – Katalog tymczasowy, przechowywane są tam różne śmieci. Dane w nim są kasowane co jakiś czas przez cron lub skrypty startowe.

/usr – Jeden z ciekawszych katalogów, do niego kopiowanych jest zwykle najwięcej plików przy instalacji programów. W obrębie katalogu /usr znajduje się kilkanaście do kilkudziesięciu katalogów, które przechowują dane zgodne ze swoimi nazwami, czyli /usr/lib przechowuje biblioteki, /usr/bin pliki binarne itd. Jeśli skompilujesz źródła jakiegoś programu, a skrypt make install uruchomisz z parametrem DESTDIR=/jakiś/katalog, to po wejściu do /jakiegoś/katalogu zobaczysz strukturę katalogów pasującą idealnie do tego, co znajdziesz w /usr (zdanie prawdziwe dla większości programów). Parametr DESTDIR po prostu zamiast skopiować odpowiednie pliki do /usr, zmienił miejsce ich przeznaczenia na /jakiś/katalog. W katalogu /usr jest jeszcze jeden ciekawy podkatalog, nazwany local. Pełni on rolę identyczną jak /usr, ale dla mało istotnych programów lub niektórych programów skompilowanych ze źródeł. W katalogu /usr/games znajdują się pliki wykonywalne gier, są one wyróżniane od zwykłych programów obecnych w /usr/bin ze względu na inne uprawnienia. Najciekawszymi katalogami z punktu widzenia użytkownika są /usr/share/icons i /usr/share/sounds jako zawierające przydatne zasoby plików graficznych i dźwiękowych.

Tworzenie katalogów

Do tworzenia katalogów służy polecenie mkdir, a jako parametr przyjmuje nazwę nowego katalogu.

[ulther@linux ~]$ mkdir katalog

Został utworzony katalog o nazwie katalog. Jeżeli z jakiegoś powodu nie uzyskamy żądanego efektu, na ekranie pojawi się komunikat:

mkdir: cannot create directory  'katalog': Plik istnieje

co oznacza, że plik lub katalog o nazwie podanej w poleceniu znajduje się już w bieżącej lokalizacji, oznacza to że musimy wymyślić inną nazwę, która jeszcze w tej lokalizacji nie występuje.

Parametry polecenia mkdir

-m — Pozwala nadać odpowiednie prawa dostępu do danego katalogu w momencie jego tworzenia. Domyślnie, jeżeli nie podamy tego parametru, system sam określi prawa dostępu.
Stwórzmy pierw katalog o nazwie kat1 bez tego parametru, a później z nim:

[ulther@linux ~]$ mkdir kat1
[ulther@linux ~]$ ls -l
drwxr-xr-x 2 ulther ulther 4096 02-05 14:51 kat1

Do katalogu zostały przypisane domyślne prawa dostępu, w postaci drwxr-xr-x. Teraz spróbujmy utworzyć ten sam katalog z prawami tylko do wykonania:

[ulther@linux ~]$ mkdir -m 111 kat1
[ulther@linux ~]$ ls -l
d--x--x--x 2 ulther ulther 4096 02-05 14:54 kat1

Jak widzimy, prawa są ustawione zgodnie z naszymi oczekiwaniami. Oczywiście moglibyśmy przypisać prawa dostępu do katalogu później, po jego utworzeniu, ale skoro możemy zrobić to za pomocą jednego polecenia…

-v, --verbose — Gadatliwość – wyświetla informację o tym, czy katalog został utworzony.

[ulther@linux ~]$ mkdir -v kat1
mkdir: utworzony katalog 'kat1'

 

Usuwanie katalogów

Katalogi można usunąć w dwojaki sposób. Pierwszym z nich jest użycie polecenia rmdir — Utwórzmy katalog, który następnie usuniemy:

[ulther@linux ~]$ mkdir kat1
[ulther@linux ~]$ rmdir kat1

Ten sposób pozwala na usuwanie pustych katalogów. Dla potwierdzenie utwórzmy nowy katalog, w nim zaś nowy plik, a następnie spróbujmy usunąć taką strukturę:

[ulther@linux ~]$ mkdir kat2
[ulther@linux ~]$ touch kat2/plik
[ulther@linux ~]$ rmdir kat2
rmdir:  'kat2': Katalog nie jest pusty

System odpowiedział, że nie może usunąć katalogu, ponieważ nie jest pusty. W takim przypadku potrzebujemy polecenia rm, które służy do usuwania plików; wraz z parametrem -R potrafi usunąć także katalog z dowolną zawartością. Pamiętać jednak należy, że NIE możemy znajdować się w katalogu, który mamy zamiar usunąć.

--ignore-fail-on-non-empty — Spowoduje, wyłączenie powiadomienia o podjętej próbie usunięcia katalogu niepustego. Skorzystajmy ponownie z utworzonego poprzednie katalogu kat2 i spróbujmy usunąć go:

[ulther@linux ~]$ rmdir kat1
[ulther@linux ~]$ rmdir kat2
[ulther@linux ~]$ rmdir --ignore-fail-on-non-empty kat2
[ulther@linux ~]$

Katalog nie został usunięty, gdyż nie jest pusty, mimo to system nie wyświetlił komunikatu o błędzie.

--verbose — Używając tego parametru system poinformuje nas o tym, że katalog został pomyślnie usunięty – lub nie, jeżeli nie jest pusty.

[ulther@linux ~]$ rmdi r --verbose kat1
rmdir: removing directory, kat1
[ulther@linux ~]$ rmdir --verbose kat2
rmdir:  'kat2': Katalog nie jest pusty

 

Tworzenie plików

Zwykle pliki tworzymy za pomocą odpowiednich programów, dzięki temu każdy plik posiada własny format i zawiera dane zapisane w sposób specyficzny dla programu, w którym został utworzony. Możemy jednak stworzyć pusty plik, w tym celu należy posłużyć się poleceniem touch.

[ulther@linux ~]$ touch nowy_plik

Zmiana daty modyfikacji plików i dostępu do nich

Czasami musimy zmienić datę modyfikacji w celu zmuszenia serwera DNS lub WWW, aby zmusić je do odpowiedniej akcji lub odświeżenia swoich plików konfiguracyjnych. Wyżej poznaliśmy podstawową funkcjonalność polecenie touch, umożliwiającą tworzyć nowe pliki, jeśli te nie istniały. Jak każde polecenie, touch również zawiera parametry:

-a — Zmienia czas ostatniego dostępu do pliku

[ulther@linux ~]$ ls -l plik
-rw-r--r-- 1 ulther ulther 0 02-05 18:27 plik
[ulther@linux ~]$ touch -a plik
[ulther@linux ~]$ ls -l plik
-rw-r--r-- 1 ulther ulther 0 02-05 18:27 plik

-c — Jeżeli plik, którego nazwę wpisujemy wraz z poleceniem touch, nie istnieje, to zostanie utworzony. Możemy temu zapobiec stosując parametr -c. Jeśli plik nie istnieje, parametr ten nie pozwoli na jego stworzenie.

[ulther@linux ~]$ touch -c plik
[ulther@linux ~]$ ls -l plik
ls: nie ma dostępu do 'plik': Nie ma takiego pliku ani katalogu

-m — Zmienia czas ostatniej modyfikacji pliku na czas bieżący.

[ulther@linux ~]$ ls -l plik
-rw-r--r-- 1 ulther ulther 0 02-05 18:27 plik
ulther@linux ~]$ touch -m plik
[ulther@linux ~]$ ls -l plik
-rw-r--r-- 1 ulther ulther 0 02-05 18:35 plik

-r plik_wzorca — Podanie pliku, z którego czas ma zostać zostać pobrany i ustanowiony jako czas modyfikacji tego pliku, którego chcemy zmienić.

[ulther@linux ~]$ ls -l plik1 pli2
-rw-r--r-- 1 ulther ulther    0 02-05 15:00 plik2
-rw-r--r-- 1 ulther ulther    0 02-05 18:35 plik1
[ulther@linux ~]$ touch -r plik2 plik1
[ulther@linux ~]$ ls -l plik1 pli2
-rw-r--r-- 1 ulther ulther    0 02-05 15:00 plik2
-rw-r--r-- 1 ulther ulther    0 02-05 15:00 plik1

-t czas — Sami ustalamy czas modyfikacji pliku. Aby ustanowić czas korzystamy z formatu RR-MM-DD gg-mm, gdzie:

  • RR – rok,
  • MM – miesiąc,
  • DD – dzień,
  • gg – godzina,
  • mm – minua.

Zmieńmy datę modyfikacji dla pliku plik1, na 22 września 1992 roku, na godzinę 7:32, a będzie to wyglądać następująco 9209220732:

[ulther@linux ~]$ ls -l plik1
-rw-r--r-- 1 ulther ulther    0 02-05 15:00 plik1
[ulther@linux ~]$ touch -t 9209220732 plik1
[ulther@linux ~]$ ls -l plik1
-rw-r--r-- 1 ulther ulther 0 1992-09-22 07:30  plik1

 

Usuwanie plików

Najczęściej używanym poleceniem do usuwanie plików i katalogów jest rm, a jako parametr podanie nazwy usuwanego pliku/katalogu:

[ulther@linux ~]$ rm nowy_plik

Wykonując to polecenie można sprawdzić, czy dany plik rzeczywiście został usunięty, w tym celu wyświetlimy zawartość katalogu, w którym znajdował się usuwany plik, używając polecenia ls -l lub vdir

-r, -R, --recursive — Najczęściej i najbardziej przydatny parametr, gdyż pozwala na rekurencyjne usuwanie całych struktur z dysku. Pozwoli nam usunąć niepuste katalogi, co było niemożliwe w przypadku użycia polecenia rmdir.

[ulther@linux ~]$ rm -r katalog

-f, --force — Powoduje usunięcie plików bez pytania o potwierdzenie i zgłaszanie błędów w przypadku kiedy nie można usunąć danego elementu z dysku.

[ulther@linux ~]$ rm -f plik
[ulther@linux ~]$

-i, --interactive — Wyświetla zapytania, czy należy usunąć dany element. Odpowiedzi udzielamy, naciskając klawisz y (jako potwierdzenie), lub innego klawisza w celu anulowania operacji usunięcia pliku.

[ulther@linux ~]$ rm -i plik
rm: remove regular file 'plik'? y

-v, --verbose — Wyświetla informacje o pliku, który został przez nas usunięty.

[ulther@linux ~]$ rm -v plik
removed 'plik'

 

Wyświetlanie zawartości pliku

Polecenie cat pozwala na wyświetlenie zawartości pliku. Jako parametr przyjmuje nazwy plików oddzielona spacją, których zawartość chcemy wyświetlić. Zastosowanie takich parametrów niestety nie prowadzi do wyświetlania zawartości w takiej kolejności jak zostały podane.
Posłużmy się przykładem; stwórzmy w swoim katalogu dwa pliki o nazwach plik1 oraz plik2. Wpiszemy do nich liczby odpowiadające ich numerom; zrobimy to za pomocą dwóch poleceń:

[ulther@linux ~]$ echo "1" > plik1
[ulther@linux ~]$ echo "2" > plik2

Wyświetlmy ich zawartość pojedynczo:

[ulther@linux ~]$ cat plik1
1
[ulther@linux ~]$ cat plik2
2

Teraz dla obu naraz:

[ulther@linux ~]$ cat plik1 plik2
1
2

Efekt przez nas oczekiwany został osiągnięty. Użyliśmy tutaj polecenia echo, które służy do wyświetlenia informacji na ekranie, używane przede wszystkim w skryptach. Wyświetliliśmy dzięki temu poleceniu liczbę (1 i 2), przekazując je do pliku za pomocą znaku >. Więcej o tych poleceniach, dowiemy się w dalszych częściach tego poradnika.
 

Kopiowanie plików i katalogów

W Linuxie do wykonania kopii pliku czy katalogu służy jedno polecenie cp wraz z odpowiednimi parametrami. Składnia polecenia określa element, który zamierzamy skopiować, oraz miejsce, w którym ma się znaleźć kopiowany element:

Teraz dla obu naraz:

[ulther@linux ~]$ cp plik katalog

W powyższym przykładzie kopiujemy plik do katalogu o nazwie katalog. Jeśli nie nadamy nazwy pliku, jak wyżej, to element zostanie skopiowany z taką samą nazwą. Jak się domyślasz, możemy nadać nową nazwę kopii elementu, jak poniżej.

Teraz dla obu naraz:

[ulther@linux ~]$ cp plik katalog/plik2
[ulther@linux ~]$ ls katalog
plik2

Kopiujemy plik do katalogu katalog, ale chcemy by kopia nosiła nazwę plik2.
-b [metoda], --backup[=metoda] — Kopiując plik do danej lokalizacji, w której znajduje się już plik o identycznej nazwie, zostanie on nadpisany przez plik, który obecnie kopiujemy; powoduje to utratę zawartości nadpisanego pliku. Używając parametru -b, plik istniejący w danej lokalizacji zostanie zapisany jako kopia zapasowa. Poniżej spróbujemy skopiować plik o nazwie plik do katalogu katalog, w którym istnieje już plik o tej samej nazwie. Możemy zauważyć że posiadamy dwa pliki. Jeden to plik oryginalny, jako kopia, zaś drugi to plik przed chwilą przez nas skopiowany.

[ulther@linux ~]$ cp -b plik katalog
[ulther@linux ~]$ ls katalog
plik   plik~

-d, --no-dereference — Kopiowanie dowiązań symbolicznych zamiast elementów, na które te dowiązania wskazują.
-f, --force — W przypadku gdy kopiujemy plik, do katalogu w którym istnieje plik o identycznej nazwie, po użyciu tego parametru zostanie on nadpisany bez wyświetlenia jakiegokolwiek pytania.

[ulther@linux ~]$ cp -f plik katalog

-i, --interactive — Odwrócenie opcji -f, czyli zostanie poproszeni o potwierdzenie, poprzez odpowiedni komunikat. Jeżeli w katalogu, do którego próbujemy przenieś plik, znajduje się już o identycznej nazwie, będzie wymagał o potwierdzenie operacji.

[ulther@linux ~]$ cp -i plik katalog
cp: overwrite 'katalog/plik' ? y

-l, --link — Tworzenie dowiązania twardego zamiast kopiowania pliku.
-p, --praserve — Plik podczas kopiowania traci swoje prawa dostępu, grupę i właściciela oraz czas utworzenia. Wartości są ustawiane zgodnie z elementem, do którego kopiujemy plik. Stosując ową opcję, oryginalne prawa i wszelkie inne dane dotyczące kopii pliku są zachowane.
-r — Rekurencyjne kopiowanie całych katalogów i ich zawartości wraz zachowaniem ich struktury.

[ulther@linux ~]$ ls
katalog1  katalog2
[ulther@linux ~]$ ls katalog1
katalog_w_katalogu1  plik1a  plik1b  plik1c
[ulther@linux ~]$ cp -r katalog1 katalog2
[ulther@linux ~]$ ls katalog2
katalog1
[ulther@linux ~]$ ls katalog2/katalog1
katalog_w_katalogu1  plik1a  plik1b  plik1c

-R, --recursive — Tak samo jak opcja -r, ale z zachowaniem wszelkich elementów niebędących plikami.
-S przyr_kopii, --suffix=przyr_kopii — W momencie kopiowania z opcją -b, tworzona jest kopia zapasowa plików, które już w danej lokalizacji się znajdują. Ta opcja pozwala dodatkowo ustalić własną nazwę sufiksu dla tych plików.

[ulther@linux ~]$ cp -b -S _kopia * katalog1
[ulther@linux ~]$ ls katalog1
katalog_w_katalogu1 katalog_w_katalogu1_kipia  plik1a  plik1a_kopia  plik1b  plik1b_kopia

-v, --verbose — Wyświetla informacje o każdym pliku, który został skopiowany.

[ulther@linux ~]$ cp -v * katalog1
'plik' -> 'katalog1/plik'
'plik1' -> 'katalog1/plik1'
'plik2' -> 'katalog1/plik2'

 

Przenoszenie plików i katalogów oraz zmiana ich nazw

Pliki i katalogi można przenosić oraz zmieniać ich nazwy za pomocą polecenia mv. Zmieniając nazwę, używamy polecenia a zanim starą nazwę istniejącego pliku i tę, na którą chcemy zmienić.

[ulther@linux ~]$ ls -l
-rw-r--r-- 1 ulther ulther 0 02-06 18:30 plik1
[ulther@linux ~]$ mv plik1 plik2
[ulther@linux ~]$ ls -l
-rw-r--r-- 1 ulther ulther 0 02-06 18:30 plik2

Przeniesienie elementu wygląda tak samo, z tą różnicą, że jako drugi parametr, podajemy miejsce do którego ma zostać przeniesiony. Drugi parametr musi istnieć fizycznie, w przeciwnym przypadku polecenie to zmieni nazwę pierwszego elementu. Przenieśmy teraz katalog1 do katalog2.

[ulther@linux ~]$ ls
katalog1  katalog2
[ulther@linux ~]$ mv katalog1 katalog2
[ulther@linux ~]$ ls
katalog2

Parametry mv

-b [metoda], --backup[=metoda] — W momencie przenoszenia pliku do innego katalogu, w którym istnieje już plik o tej samej nazwie, ten drugi zostanie nadpisany, wskutek czego możemy stracić zapisane w nim dane. Chcąc uniknąć tego, musimy użyć parametru -b. Pozwoli to na utworzenie kopii drugiego elementu, istniejącego już pliku, a oryginał zostanie nadpisany przez przenoszony.

[ulther@linux ~]$ mv -b plik1 katalog1
[ulther@linux ~]$ ls katalog1
plik1  plik1~

-f, --force — Gdy w katalogu, do którego chcemy przenieść będzie plik o identycznej nazwie, po użyciu tego parametru zostanie nadpisany bez powiadamiania o tym użytkownika.

[ulther@linux ~]$ mv -f plik1 katalog1
[ulther@linux ~]$

-i, --interactive — Zostaniemy poproszeniu o potwierdzenie nadpisania elementu, gdy nazwa pliku przenoszonego jest identyczna z plikiem, który się znajduje w katalogu, do którego przenosimy. Możemy potwierdzić klawiszem y, lub anulować dowolnym innym.

[ulther@linux ~]$ mv -i plik1 katalog1
mv: overwrite 'katalog1/plik1'? y

-S przyr_kopii, --suffic=przyr_kopii — Używamy wraz z parametrem -b. Pozwala na zdefiniowanie własnego sufiksu kopii zapasowej pliku, który nadpisujemy.

[ulther@linux ~]$ mv -b -S _kopia plik1 katalog1
[ulther@linux ~]$ ls katalog1
plik1  plik1_kopia

-u, --update — W przypadku gdy data modyfikacji przenoszonego pliku jest nowsza niż tego, który znajduje się się w katalogu docelowym; zostanie on nadpisany.
-v, --verbose — Gadatliwość. Program informuje nas o każdym pliku, który został przeniesiony.

[ulther@linux ~]$ mv -v plik1 plik2 plik3 katalog1
[ulther@linux ~]$ ls katalog1
przemianowany 'plik1' -> 'katalog1/plik1'
przemianowany 'plik2' -> 'katalog1/plik2'
przemianowany 'plik3' -> 'katalog1/plik3'

Dodaj komentarz