Obcování s ďáblem 5 - Stále soubory, hlavně linky - MujMAC.cz - Apple, Mac OS X, Apple iPod

Odběr fotomagazínu

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:

Seriály

Více seriálů



Tipy a Triky

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):

Tématické zařazení:

 » Rubriky  » Informace  

 » Rubriky  » Agregator  

 » Rubriky  » Tipy a Triky  

 » Rubriky  » Začínáme s  

 » Rubriky  » Software  

 

 

 

Nejčtenější články
Nejlépe hodnocené články
Apple kurzy

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: