Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
Software
Obcování s ďáblem 5 - Stále soubory, hlavně linky
23. srpna 2001, 00.00 | Ačkoli o "práci se soubory" již mluvíme dost dlouho, dosud jsme se seznámili pouze s příkazy, vhodnými pro jejich prohlížení. Dnes se však již vrhneme na skutečnou "práci" - tj. kopírování, přejmenovávání, rušení a podobně.
Ačkoli o "práci se soubory" již mluvíme dost dlouho, dosud jsme se seznámili pouze s příkazy, vhodnými pro jejich prohlížení. Dnes se však již vrhneme na skutečnou "práci" - tj. kopírování, přejmenovávání, rušení a podobně.
Nejdřív chceme místo na hraní!
I v předchozích dílech jsme se občas setkali se složkou "/tmp"; dnes je však načase si vysvětlit její zvláštní postavení: jde totiž o dočasnou složku, do které může kdokoli ukládat cokoli - s vědomím, že jakmile dojde k restartu, obsah složky bude automaticky smazán.
Složka "/tmp" je proto ideální na nejrůznější testy a pokusy; jen si dejte pozor, a nenechávejte v ní důležité věci: při nejbližším restartu byste o ně přišli.
Nejjednodušší je přejmenování...
...spolu s přemístěním, protože pro oba slouží jediný společný příkaz, mv ("MoVe"). Příkaz mv navíc funguje stejně dobře pro obyčejné soubory jako pro složky. Existují dvě podoby příkazu mv:
mv staré_jméno nové_jméno
mv seznam_složek_a_souborů složka
V prvém případě jsou obě jména jmény souborů nebo složek, a příkaz prostě zamění prvé jméno druhým. Pokud mají obě jména odlišné cesty, soubor nebo složka se přemístí. Podívejme se na pár příkladů - středníky a texty za nimi nejsou součástí příkazů, jen informují o tom, co se děje:
mv xxx yyy ; přejmenuje soubor či složku "xxx" v aktuální složce na "yyy"
mv /tmp/aaa /tmp/bbb ; přejmenuje soubor či složku "aaa" ve složce "/tmp" na "bbb"
mv /tmp/xyz ~/Documents/Text.txt ; přemístí soubor "xyz" ze složky "/tmp" do složky "Documents" v naší domovské složce, a zároveň jej přejmenuje na "Text.txt"
Uživatelé DOSu si musí dát trochu pozor, a neplést si chování příkazu mv s DOSovským RENAME: "mv /tmp/xxx yyy" nejen přejmenuje soubor "xxx" ze složky "/tmp" na "yyy", ale zároveň jej přemístí do aktuální složky!
Jestliže je poslední argument jménem některé existující složky, platí druhá varianta: argumentů může být libovolně mnoho (nejen dva), a všechny soubory a složky určené všemi argumenty až po předposlední se prostě přemístí do složky, určené posledním argumentem:
mv xxx ~/yyy ~/Documents/*.old /tmp ; přemístí "xxx" z aktuální složky, "yyy" z domovské složky, a všechny soubory nebo složky s příponou ".old" ve složce "~/Documents" do složky "/tmp"
V tomto případě k žádnému přejmenování nedojde.
Chceme-li přemístit objekty do aktuální složky, můžeme použít speciální jméno, jež vždy representuje aktuální složku - tečku:
mv /tmp/xxx . ; přemístí soubor "xxx" ze složky "/tmp" do aktuální složky
Mimochodem, příkaz mv samozřejmě funguje "chytře", tj. pokud jím přemísťujeme složku nebo soubor v rámci jednoho disku, změní opravdu pouze jméno, zatímco vlastní obsah souboru či složky zůstává na disku beze změny. Přejmenovávání a přemísťování souborů a složek v rámci disku je tedy vždy velmi rychlá operace, bez ohledu na velikost souboru nebo na to, co všechno složka obsahuje. Ovšemže můžeme přemísťovat soubory a složky i na jiné disky; pak se ale jejich obsah musí zkopírovat (a po úspěšném kopírování ten původní smazat), takže to může být operace na dlouho.
Kopírování
Kopírování příkazem cp ("CoPy") funguje velmi podobně jako přejmenování - opět máme k dispozici dvě základní podoby:
cp původní_objekt nový_objekt
cp seznam_objektů složka
přičemž první z nich vytvoří kopii se zadaným jménem, zatímco druhá zkopíruje vše, co je určeno prvým až předposledním argumentem, do složky, určené posledním argumentem.
Na rozdíl od příkazu mv však příkaz cp ignoruje složky. Chceme-li kopírovat složky stejně dobře jako soubory, musíme to dát příkazu cp na vědomí přepínačem -R ("Recursive"):
90 ~> cp A* /tmp
cp: Applications is a directory (not copied).
91 ~> cp -R A* /tmp
92 ~>
Nakonec opět jedno varování pro uživatele DOSu: nezapomínat na tečku! Zatímco DOSovské "COPY \tmp\*.tiff" zkopíruje všechny TIFFy ze složky "/tmp" na aktuální složku, příkaz "cp /tmp/*.tiff" nám v lepším případě vynadá, a v horším - když byly obrázky ve složce "/tmp" právě dva - jeden z nich zničí (je jasné proč a jak?).
Pryč s tím!
Pro rušení souborů a složek slouží příkaz rm ("ReMove"). Podobně jako cp, ani rm neumí v základní podobě mazat složky; můžeme si však pomoci přepínačem -rf, který příkazu rm řekne "Na nic se neptej, a smaž co jde":
rm -rf seznam_objektů
Uživatelé moderních GUI, zhýčkaní odpadkovým košem, si musí dávat pozor: data smazaná příkazem rm obnovit nelze!
Zástupce, alias link...
Unixové systémy odpradávna nabízejí tzv. linky, a to ve dvou podobách: hardlink a softlink. Mac OS X k tomu jako trochu nešťastné dědictví přidal navíc tzv. aliasy. Vzhledem k tomu, že český termín "zástupce" je v tomto kontextu trochu matoucí (OS X ještě není lokalizován, ale předpokládám, že "zástupce" bude "alias", a "linky" se nejspíš překládat nebudou), budu raději používat anglické termíny, a surově je budu skloňovat - programátoři a pokročilí uživatelé to tak ostatně dělají odjakživa.
Nejrychleji odbydeme aliasy: jde o specialitu Finderu a HFS+, která na úrovni standardního souborového API prostě není nijak podporována! To je to, co mám "makovským" aliasům nejvíc za zlé: pokud je budete používat (a Finder, bohužel, neumožňuje vůbec vytvoření linků, umí vyrábět jen aliasy), naděláte si spoustu problémů, protože ani příkazy shellu, ani běžné programy využívající standardní API pro práci se soubory, a konečně ani nativní aplikace psané v prostředí Cocoa a nevyužívající Carbon, s nimi nebudou schopny pracovat! Chyba je právě v tom, že aliasy nejsou součástí systému souborů jako linky, ale pro jejich interpretaci je třeba explicitně využít speciální služby Carbonu. V shellu aliasy vypadají jako obyčejné soubory velikosti 0 bytů, a vyjma mazání či přejmenování se s nimi nedá dělat zhola nic.
Linky naproti tomu jsou plně podporovány na libovolné úrovni standardního přístupu k souborům: ať uděláme "ls" nebo "cd" v shellu, ať použijeme standardní program, který otevírá soubory pomocí portabilních knihovních služeb typu fopen, ať napíšeme program, který využívá standardních služeb Cocoa typu stringWithContentsOfFile:, všude budou linky bez nejmenších problémů interpretovány.
Nejprve si vysvětlíme hardlinky: v UFS (a díky speciální podpoře, již firma Apple do OS X doplnila, i v HFS+) může mít soubor libovolné množství jmen, na sobě naprosto nezávislých. Pojem hardlink se používá právě pro takové jméno, a vytvoříme jej příkazem ln ("LiNk"):
ln původní_jméno_souboru nové_jméno_souboru
Počet jmen, která pro soubor existují, zobrazuje příkaz "ls -l": vzpomeňte si na záhadnou jedničku hned vedle přístupových práv v minulém dílu! Ta znamenala, že pro každý ze zkoumaných souborů existuje jen jedno jméno.
Všechna jména jsou naprosto rovnocenná, takže nemá smysl se ptát "je tohle hardlink nebo původní soubor": mezi jménem, se kterým byl soubor původně vytvořen, a jeho dalšími jmény, vytvořenými příkazem ln, není žádný rozdíl. Všechna jména také můžeme v libovolném pořadí a nezávisle na sobě mazat příkazem rm; vlastní soubor bude existovat tak dlouho, dokud existuje alespoň jedno jeho jméno:
105 /tmp> ls -l test*
-rw-r-r- 1 ocs staff 54 Aug 15 09:09 test
106 /tmp> ln test test1
107 /tmp> ls -l test*
-rw-r-r- 2 ocs staff 54 Aug 15 09:09 test
-rw-r-r- 2 ocs staff 54 Aug 15 09:09 test1
108 /tmp> ln test test2
109 /tmp> ln test test3
110 /tmp> ls -l test*
-rw-r-r- 4 ocs staff 54 Aug 15 09:09 test
-rw-r-r- 4 ocs staff 54 Aug 15 09:09 test1
-rw-r-r- 4 ocs staff 54 Aug 15 09:09 test2
-rw-r-r- 4 ocs staff 54 Aug 15 09:09 test3
111 /tmp> rm test[12]
112 /tmp> ls -l test*
-rw-r-r- 2 ocs staff 54 Aug 15 09:09 test
-rw-r-r- 2 ocs staff 54 Aug 15 09:09 test3
113 /tmp> ln test ~/testZRootu
114 /tmp> ls -l test*
-rw-r-r- 3 ocs staff 54 Aug 15 09:09 test
-rw-r-r- 3 ocs staff 54 Aug 15 09:09 test3
115 /tmp> rm test*
116 /tmp> ls -l test*
zsh: no matches found: test*
117 /tmp>
Všechna jména "test", "test1",... pořád patřila jednomu a témuž souboru, který byl uložen na disku pouze jednou (a případné změny jeho obsahu, provedené "skrz" kterékoli jméno, jsou okamžitě vidět i "skrz" ostatní jména). Na řádku 117 soubor ještě pořád existoval, protože stále existovalo jedno jeho jméno (totiž "testZRootu" v domovské složce). Teprve příkaz
117 /tmp> rm ~/testZRootu
zruší nejen jméno (hardlink), ale i samotný soubor - proto, že žádné další jméno už neexistuje.
Hardlinky jsou naprosto ideální pro sdílení informací a dat; bohužel, mají dvě velmi zásadní nevýhody:
- nelze jich využívat pro složky;
- nelze uložit hardlink souboru na jiný disk, než na kterém leží sám soubor.
Proto se v praxi častěji využívají softlinky. Softlink je prostě soubor, který obsahuje cestu a jméno jiného souboru (nebo složky); chceme-li softlink "použít" (např. otevřít soubor), systém souborů automaticky rozezná, že jde o softlink, a použije "správné" jméno z jeho obsahu. Softlink vytvoříme příkazem "ln -s":
ln -s cesta_a_jméno link
Velice důležitou vlastností softlinků je to, že cesta_a_jméno může být jak relativní, tak i absolutní, a že se interpretuje až při použití linku (a ne při jeho vytvoření). Z toho plynou (mimo jiné) následující výhody:
(a) vytvoříme-li link např. příkazem "ln -s ~/Projects/AppQ/build/AppQ.app ~/Applications", budeme mít ve složce "Applications" vždy aktuální versi aplikace AppQ, na které právě pracujeme: kdykoli projekt znovu přeložíme, link bude od té chvíle automaticky representovat novou versi! To by nebylo možné ani s hardlinky, ani s aliasy;
(b) vytvoříme-li relativní link např. příkazem "ln -s Folder/xxx yyy", bude možné celou strukturu, obsahující jak soubor "xxx", tak i link "yyy", korektně kopírovat: vytvoří se jak kopie souboru, tak i kopie linku; kopie linku bude korektně ukazovat na kopii souboru! To ukazuje následující obrázek:
Pro srovnání, zamysleme se nad tím, co by se stalo při použití hardlinku nebo aliasu: u hardlinku při kopírování nelze odlišit "původní jméno" a "link", takže by se prostě soubor zkopíroval dvakrát - oba běžné soubory "xxx" a "yyy" by měly totožný obsah, ale link by se ztratil:
Naopak, kdybychom použili alias, zkopíroval by se beze změny, a nadále by ukazoval na původní soubor - pokud jsme kopii vytvářeli pro archivní účely nebo proto, že si ji chceme na jiném médiu odnést s sebou, rozhodně to není žádoucí:
Pokud naopak toto chování vyžadujeme, je možné jej snadno docílit i se softlinky - stačí namísto relativního linku použít link absolutní (tj. takový, který obsahuje absolutní cestu, začínající lomítkem - pro náš příklad by to bylo "ln -s /tmp/test/Folder/xxx yyy").
Naopak je samozřejmě zapotřebí si dát pozor na to, že přemístěním nebo přejmenováním souboru, na který softlink odkazuje, se link "zničí" (tj. nadále nefunguje, protože odkazovaný soubor nelze nalézt): to je sice malá (a nutná) cena za výhodu (a), ovšem ti, kdo jsou zvyklí na aliasy, na to často narážejí.
Ještě snad stojí za to znovu zdůraznit, že při vytváření softlinku se jeho obsah neinterpretuje - to až při jeho použití. Ti, kdo si to neuvědomují, se často diví, že relativní link typu
169 /tmp/test> ls -l Folder/xxx
-rw-r-r- 1 ocs wheel 3 Aug 15 17:30 Folder/xxx
170 /tmp/test> ln -s Folder/xxx ~/mujOdkazNaXxx
171 /tmp/test>
"nefunguje", protože když pak přejdou do domovské složky, nemohou se na soubor "/tmp/test/Folder/xxx" přes odkaz dostat. Ovšemže ne! Vytvořili jsme přeci v domovské složce relativní link, obsahující cestu "Folder/xxx"; cesta se samozřejmě interpretuje v rámci složky, ve které link leží - takže link bude odkazovat na soubor "~/Folder/xxx" (pokud takový existuje)!
Stačí to?
Ačkoli existuje ještě několik dalších příkazů pro práci se soubory, o kterých si povíme (např. mkdir nebo touch), necháme si je na příště. Nejen proto, že už je zase tento díl nekřesťansky dlouhý, ale i proto, že bych měl rád jistotu jsou-li základy práce se soubory - a zvlášť linky - opravdu jasné. Pokud ne, napiště mi nebo do diskuze pod článkem, a já příště uvedu ještě více a podrobnějších příkladů!
Obsah seriálu (více o seriálu):
- Obcování s ďáblem
- Obcování s ďáblem 2 - základy
- Obcování s ďáblem 3 - Práce se soubory
- Obcování s ďáblem 4 - Další práce se soubory
- Obcování s ďáblem 5 - Stále soubory, hlavně linky
- Obcování s ďáblem 6: Pár zbývajících drobností
- Obcování s ďáblem 7: Samá voda, přihořívá, hoří!
- Obcování s ďáblem 8: Jak se do shellu volá, tak se program ozývá
- Obcování s ďáblem 9: Nové finty na programy
- Obcování s ďáblem 10: Do fronty, pánové, do fronty!
- Obcování s ďáblem 11: Standardní vstup a výstup
- Obcování s ďáblem 13: Další triky
- Obcování s ďáblem 14: Vyšší škola hledání souborů
- Obcování s ďáblem 15: Příkaz find stokrát jinak
- Obcování s ďáblem 16: Co se ještě dá uvařit z příkazu find
- Obcování s ďáblem 17: Regulární výrazy
- Obcování s ďáblem 18: Speciální regulární výrazy
- Obcování s ďáblem 19: Skládání regulárních výrazů
- Obcování s ďáblem 20: Regulární výrazy se zpětnými odkazy
- Obcování s ďáblem 21:K čemu je dobrý grep...
- Zázraky ihned, nemožné na počkání: sed
- Obcování s ďáblem - další finty s příkazem sed
- Rozsáhlejší příklad se sedem
- Obcování s ďáblem: Další kouzla, aneb awk
- Awk a proměnné
- Obcování s ďáblem 27: Awk a výrazy
- Obcování s ďáblem: Awk a funkce
- Awk a příkazy
- Co je to vlastně "uživatel"?
- Vlastnictví objektů
- Přístupová práva
- Vlastník, skupina, ostatní...
- Jak je to se skupinami?
- Skupiny a uživatelé
- Scripty
- Komentáře, a volba shellu
- Pro skript může být shell cokoli!
- Shellové skripty a argumenty
- Skripty a proměnné: aritmetika
- Proměnné shellu, "dědění" hodnot
- Práce s proměnnými
- Práce se jmény souborů
- Pole hodnot
- Další triky kolem polí...
- Standardní proměnné shellu
- Základní příkazy pro skripty
- Příkaz if
- Speciální podmínkové příkazy
- Podmínky pro práci se soubory
- Jednoduchý cyklus
- Příkaz for a pomocné příkazy break a continue
- Příkaz case
- Příkazy exit a select
- Rejstřík a přehled
- Procesy
- Informace o procesech
- Další klíčová slova pro příkaz ps
- Příkaz ps: několik praktických přepínačů
- A k čemu že je "ps" dobré?
- Copak procesor, s pamětí je to horší
- Virtuální paměť
- A ještě jednou virtuální paměť
- Zpět k příkazu ps
- Skutečný žrout paměti
- Ještě jednou top
- Doplněk k topu: vm_stat
- Co to tedy všechno znamená?
- Nevychází nám dal a má dáti?
- Kam se stránky ukládají?
- Změna odkládacího disku
- Změna odkládacího disku / fstab
- Poslední poznámka k fstab
- A jak to je se soubory?
- Co vlastně příkaz lsof vypisuje?
- Příkaz lsof a obsah sloupce NAME
- SIPS - Terminál není jen pro nadšence UNIXu
- Tak nám zabili NetInfo, paní Müllerová