Linux: Kniha kouzel, 2.15 (1. března 2025)
Veškerá moc příkazové řádky/příkazového řádku přehledně, pro začátečníky i pokročilé

22. Soubory a adresáře

Vývoj vanilkové příchuti Linuxu: Knihy kouzel byl 1. března 2025 ukončen. Tento text je zachován jako historický, ale chyby již nejsou opravovány. Odnože projektu pod kompatibilní licencí jsou vítány.

1. Úvod

Tato kapitola se zabývá prací s adresáři a jejich položkami (soubory, podadresáři apod.), včetně jejich velikosti, vlastnictví, přístupových práv, příznaků a datových položek. Nepokrývá však zacházení s konkrétním obsahem souborů (analýzu, kopírování, zálohování apod.).

Příkazy chmod, find, stat a některé další jsou vyvíjeny v rámci projektu GNU.

2. Definice

  • Adresářová položka je jednoznačně pojmenovaná položka v adresáři; obvykle je to soubor (přesněji – pevný odkaz na soubor), další adresář či symbolický odkaz, méně často zařízení (např. „/dev/null“), pojmenovaná roura apod. Adresářové položky se v daném adresáři identifikují svým názvem, který může obsahovat jakékoliv znaky UTF-8 kromě nulového bajtu a znaku „/“. V každém adresáři se nacházejí dva zvláštní adresářové odkazy „.“ (na sebe) a „..“ (na nadřazený adresář), které se ale nepočítají a většina nástojů je ignoruje (bohužel ne všechny).
  • Adresářová položka je skrytá, pokud její název začíná znakem „.“.
  • Přístupová práva jsou nastavení souboru či adresáře, která určují, kteří uživatelé budou moci s daným souborem či adresářem zacházet. Nastavení přístupových práv se dělí na tři základní nastavení, která jsou přítomna vždy, a rozšířená nastavení (ACL, access control list), která lze přidávat či odebírat. (Vedle toho existují ještě „výchozí“ nastavení, ale těmi se pro jejich neintuitivnost a zřídkavé využití budu zabývat jen okrajově.)
  • Zvláštní příznaky jsou příznaky, které mohou být nastaveny souborům a adresářům a mají na ně zvláštní účinky; dělí se na tři základní zvláštní příznaky (u+s, g+s, +t) a mnoho rozšířených zvláštních příznaků. Zatímco ty základní jsou podporované na všech nativně linuxových typech souborových systémů, podpora těch rozšířených se liší.
  • Mód (mode) je standardizované číselné vyjádření základních přístupových práv a základních zvláštních příznaků v osmičkové soustavě.
  • Uživatelské datové položky (user xattrs, user extended attributes) umožňují k souborům a adresářům ukládat další obecná data v podobě dvojic klíč–hodnota. Nejčastěji se používají k uložení krátkých čísel či textových řetězců, např. URL, ze kterého byl daný soubor stažen. Mají řadu nevýhod – jsou před uživatelem poměrně skryté (příkazy „ls“ ani „find“ s nimi neumí pracovat), při kopírování či zálohování se obvykle ztratí a nejsou příliš využívány. Proto doporučuji se jim raději vyhýbat a dodatečná data ukládat do samostatných, skrytých souborů.

2/1 Přístupová práva

V linuxu se u souborů a adresářů povolují či zakazují tři přístupová práva:

Právo čtení (r, číselná hodnota „4“, read) znamená:

  • U souboru právo otevřít soubor pro čtení a přečíst jeho obsah, a to jak sekvenčně, tak na přeskáčku.
  • U adresáře právo přečíst seznam názvů položek v adresáři včetně jejich typu (soubor či adresář), ale už bez dalších údajů.

Právo zápisu (w, číselná hodnota „2“, write) znamená:

  • U souboru právo otevřít daný soubor pro zápis, zkrátit ho (i na nulovou velikost), přepisovat existující bajty souboru a zapisovat nové na jeho konec.
  • U adresáře právo vytvářet nové adresářové položky, měnit názvy stávajících a stávající mazat.

Právo spouštění (x, číselná hodnota „1“, execute) znamená:

  • U souboru právo daný soubor spustit jako proces. Toto právo stačí, pokud se jedná o program v přímo spustitelném binárním formátu; jde-li ve skutečnosti o interpretovaný skript, je potřeba také právo „r“, aby ho příslušný interpret mohl číst.
  • U adresáře právo do daného adresáře vstoupit, zjistit podrobnější informace o jeho položkách (např. přístupová práva) a dál k nim přistupovat. Nezahrnuje však možnost přečíst seznam názvů položek, takže pokud máte k adresáři samotné právo „x“, musíte znát názvy jeho položek, abyste s nimi mohli zacházet. (Samotné právo „r“ bez práva „x“ zase umožní programu vypsat seznam položek v adresáři, ale už o nich nebude moci nic zjistit.

Každá adresářová položka má vlastníka (což je některý uživatel, např. „root“) a příslušnou skupinu. Přístupová práva může měnit pouze vlastník položky nebo superuživatel.

Existují tři základní nastavení přístupových práv: pro vlastníka („u“), pro skupinu („g“) a pro ostatní („o“), vždy v tomto pořadí. Rozšířená nastavení přístupových práv jsou seznam dalších položek, které mohou stanovovat dodatečná práva konkrétním uživatelům a skupinám. Tento seznam však může být (a také obvykle bývá) prázdný.

Nastavení přístupových práv se uplatňují následovně:

  • Když k položce přistupuje její vlastník, uplatní se jen a pouze základní nastavení přístupových práv pro vlastníka („u“); žádné jiné nastavení se neuplatní, dokonce ani rozšířené nastavení přístupových práv, které vlastníka výslovně jmenuje.
  • Jinak se vezme základní nastavení pro skupinu („g“) a všechny položky rozšířeného nastavení. Pokud bude mezi nimi nalezena alespoň jedna „odpovídající“ položka, tedy např. skupina, jejíž je uživatel členem, uživatel dostane všechna práva garantovaná alespoň některou odpovídající položkou. (To znamená, že když např. bude adresář „adr“ mít nastavena pro skupinu „askup“ práva „r--“ a pro skupinu „bskup“ práva „--x“, uživatel, který je členem obou skupin, ale není vlastníkem daného adresáře, má k adresáři „adr“ práva „r-x“.)
  • Jedině pokud nebyla v druhém kroku nalezena žádná odpovídající položka, uplatní se nastavení pro ostatní („o“).

2/2 Základní zvláštní příznaky

Vedle přístupových práv může mít každý soubor či adresář nastaveny ještě tři základní zvláštní příznaky:

Příznak zmocnění vlastníka (u+s, číselná hodnota „4“, set-uid bit):

  • U souboru má význam pouze v kombinaci s právem „x“. Je-li takový soubor spuštěn, vzniklý proces získá EUID (a tedy i práva) vlastníka souboru, a to i v případě, že ho spustil jiný uživatel. Nejčastějším použitím je spuštění určitého programu s právy superuživatele.
  • U adresáře nemá žádný význam.

Příznak zmocnění skupiny (g+s, číselná hodnota „2“ set-gid bit):

  • U souboru funguje analogicky jako příznak zmocnění vlastníka – vzniklý proces získá EGID (tedy skupinová práva) skupiny souboru.
  • U adresáře znamená, že všechny nově vytvořené adresářové položky v adresáři s tímto příznakem budou při vytvoření přiřazeny stejné skupině jako adresář, ve kterém byly vytvořeny. (Normálně by získaly skupinu podle procesu, který je vytvořil.) Takto vytvořené podadresáře navíc získají také příznak zmocnění pro skupinu, což znamená, že tento příznak se automaticky rozšíří i do všech nově vytvořených podadresářů, pokud u nich nebude výslovně zrušen.

Příznak omezení smazání (+t, číselná hodnota „1“, sticky-bit):

  • U souboru nemá žádný význam.
  • U adresáře omezuje výkon práva „w“ – brání ve smazání či přejmenování „cizích položek“, tedy přesněji – zabrání ve smazání či přejmenování adresářové položky každému uživateli, který není vlastníkem dané položky či vlastníkem samotného adresáře. Hlavním smyslem této kombinace je, že uživatelé mohou v daném adresáři vytvářet nové položky a ty jsou pak chráněny před zásahy jiných uživatelů, kteří mají k témuž adresáři také právo zápisu. Tento příznak je typicky nastaven na adresáři „/tmp“. Poznámka: vzniklé podadresáře tento příznak nedědí.

2/3 Superuživatel

Na superuživatele se nevztahují žádná přístupová práva a příznaky zmocnění vlastníka a omezení smazání. Ostatní zvláštní příznaky (zejména ty rozšířené) se vztahují i na superuživatele.

2/4 Mód

Mód se vyjadřuje čtyřmístným číslem v osmičkové soustavě (0000 až 7777), kde jednotlivé číslice zleva doprava znamenají: Příznaky, práva vlastníka, práva skupiny, práva ostatních. První číslice vyjadřující příznaky je nepovinná, mód tedy lze zadat i trojmístným číslem; místo chybějící úvodní číslice se pak uvažuje nula.

Každou číslici vypočteme jako součet číselných hodnot příznaků, které mají být nastaveny, a práv, která mají být přidělena. (Číselné hodnoty příznaků a práv jsou uvedeny výše.)

Příklad: chceme-li adresáři nastavit příznak omezení smazání (číselná hodnota 1) a nastavit, že vlastník bude mít všechna práva (4 + 2 + 1), skupina jen právo čtení (4) a ostatní nebudou mít žádná práva (0), výsledný mód bude: „1740“.

Pro čtení módu si musíme zapamatovat význam jednotlivých číslic v pořadí a číselné hodnoty příznaků a práv. Pak můžeme mód snadno přečíst následujícím postupem:

  • Pokud je číslice 4, 2 nebo 1, výsledkem je právě jeden příznak/právo této číselné hodnoty.
  • Pokud je číslice 7, výsledkem jsou všechny příznaky/práva.
  • Pokud je číslice 0, výsledkem jsou žádné příznaky/práva.
  • U zbylých číslic (6, 5 nebo 3) budou výsledkem dva příznaky/práva; u nich zkoušíme postupně odečíst 4 a 2; pokud se nám to podaří, aniž bychom se dostali pod nulu, zapíšeme příznak/právo odpovídající číslici, kterou jsme odečetli, a druhý příznak/právo odpovídající číslici, která nám po odečtení zbyla. 6 = 4 + 2, 5 = 4 + 1, 3 = 2 + 1.

Příklad: mějme mód 3571. První číslice: 4 odečíst nejde, takže odečteme 2 a zbude nám jedna; zapíšeme tedy příznak zmocnění skupiny (hodnota 2) a příznak omezení smazání (hodnota 1). Druhá číslice: 4 odečíst jde a zbude nám 1, zapíšeme tedy práva čtení (4) a spouštění (1). Třetí číslice: 7 znamená pro skupinu všechna práva, tedy čtení, zápis i spouštění. Čtvrtá číslice: 1 znamená pro ostatní jen právo spouštění.

2/5 Rozšířené zvláštní příznaky

Rozšířené zvláštní příznaky jsou relativně málo významné, málo uživtečné a jejich podpora je omezená typem souborového systému. Mezi užitečné z nich patří:

  • Příznak „a“ (ext4: ano, btrfs: ano, tmpfs: ne) – Poskytne souboru či adresáři silnou ochranu před zápisem a jinými změnami, ale na rozdíl od příznaku „i“ umožňuje zápis za konec souboru a u adresáře vytvoření nové adresářové položky (její přejmenování či smazání už ne). Nově vytvářené podadresáře tento příznak nedědí.
  • Příznak „i“ (ext4: ano, btrfs: ano, tmpfs: ne) – Poskytne souboru či adresáři silnou ochranu před zápisem a jinými změnami. Pozor, na soubor s tímto příznakem nelze ani vytvořit nový pevný odkaz, přejmenovat ho nebo změnit jeho vlastnictví či přístupová práva!
  • Příznak „S“ (ext4: ano, btrfs: ano, tmpfs: ne) – Změny se zapisují okamžitě na disk. (Normálně čekají nějakou dobu v paměti.) Nově vytvořené soubory a adresáře tento příznak dědí.
  • Příznak „C“ (ext4: ne, btrfs: ano, tmpfs: ne) – Byl-li tento příznak nastaven prázdnému souboru, jeho později alokované datové bloky na disku nebudou sdíleny s jinými soubory (např. klony). Je-li tento příznak nastaven adresáři, nově vytvořené soubory a podadresáře ho zdědí.
  • Příznak „A“ (ext4: ano, btrfs: ano, tmpfs: ne) – Čas posledního přístupu („atime“) nebude aktualizován. (Nezkoušel/a jsem.)

3. Zaklínadla

3/1 Vypsat seznam adresářových položek (pro člověka)

@všech kromě skrytých#1
ls [-lh] [adresář]
@všech kromě „.“ a „..“#2
ls -A[lh] [adresář]
@jen adresářů (a symbolických odkazů na ně)(kromě/včetně skrytých)#3
tree -dL 1
tree -daL 1
@jen souborů (a symbolických odkazů na ně)(kromě/včetně skrytých)#4
find -L adresář -mindepth 1 -maxdepth 1 -type f -name '[!.]*' -printf %f\\n [| sort -f]
find -L adresář -mindepth 1 -maxdepth 1 -type f -printf %f\\n [| sort -f]
@adresářů a podadresářů včetně symbolických odkazů na adresáře (kromě/včetně skrytých)#5
tree -d[L úrovní]
tree -da[L úrovní]
@všech včetně „.“ a „..“#6
ls -a[lh] [adresář]

3/2 Vypsat seznam adresářových položek (pro skript)

@všech (txt/txtz)#1 (1)
find adresář -mindepth 1 -maxdepth 1 -printf %P\n
find adresář -mindepth 1 -maxdepth 1 -printf %P\0
@jen souborů (txt/txtz)#2
find adresář -mindepth 1 -maxdepth 1 -type f -printf %P\n
find adresář -mindepth 1 -maxdepth 1 -type f -printf %P\0
@jen adresářů (txt/txtz)#3
find adresář -mindepth 1 -maxdepth 1 -type d -printf %P\n
find adresář -mindepth 1 -maxdepth 1 -type d -printf %P\0
@všech kromě skrytých (txt/txtz)#4
find adresář -mindepth 1 -maxdepth 1 -name '[!.]*' -printf %P\n
find adresář -mindepth 1 -maxdepth 1 -name '[!.]*' -printf %P\0
@všech včetně „.“ a „..“ (txt/txtz)#5
{ printf %s\n . ..; find adresář -mindepth 1 -maxdepth 1 -printf %P\n; }
{ printf %s\0 . ..; find adresář -mindepth 1 -maxdepth 1 -printf %P\0; }

3/3 Testy

@existuje adresářová položka?#1
test -e cesta
@je adresářová položka {soubor/adresář/pojmenovaná roura} nebo symbolický odkaz na ni/něj?#2
test -f cesta
test -d cesta
test -p cesta
@je adresářová položka soubor/adresář/symbolický odkaz/pojmenovaná roura?#3
test -f cesta -a ! -L cesta
test -d cesta -a ! -L cesta
test -L cesta -a ! -L cesta
test -p cesta -a ! -L cesta
@je adresářová položka symbolický odkaz (jakýkoliv/relativní/absolutní)#4
test -L cesta
test -L cesta && readlink [--] cesta | egrep -qv ^/
test -L cesta && readlink [--] cesta | egrep -q ^/
@je soubor neprázdný/prázdný?#5
test -f cesta -a -s cesta
test -f cesta -a ! -s cesta
@má položka nastavený zvláštní příznak u+s/u+g/+t?#6
[[ $(stat -c %04a [--] cesta) =~ ^[4567] ]]
[[ $(stat -c %04a [--] cesta) =~ ^[2367] ]]
[[ $(stat -c %04a [--] cesta) =~ ^[1357] ]]

3/4 Srovnání

Poznámka: srovnávané položky nemusejí být v tomtéž adresáři; můžete je zadat i s relativní či absolutní cestou.

@je položka1 novější než položka2? (z hlediska času poslední úpravy)#1
test položka1 -nt položka2
@je soubor1 větší/větší nebo stejně velký než soubor2?#2
test $(stat -c %s "soubor1") -gt $(stat -c %s "soubor2")
test $(stat -c %s "soubor1") -ge $(stat -c %s "soubor2")
@odkazují dvě položky na tutéž entitu (soubor, adresář apod.)?#3
test položka1 -ef položka2
@jsou obě položky stejně staré?#4
test ! položka1 -nt položka2 -a ! položka1 -ot položka2

3/5 Zjistit údaje

@prostor zabraný na disku adresářem a celým jeho podstromem (v bajtech/čitelně pro člověka)#1
du -s0[x] -B 1 adresář | sed -zE 's/\s.*/\n/' | tr -d \\0⊨ 16404
du -sh[x] adresář⊨ 28K .
@přístupová práva (kompletní/základní číselně/základní textově pro člověka)#2
getfacl -ac [--] cesta⊨ user::rw- (výstup má víc řádek)
stat -c %[04]a [--] cesta⊨ 1775
stat -c %A [--] cesta⊨ -rwxrwxr-t
@celková velikost (v bajtech/čitelně pro člověka)#3
stat -c %s cesta⊨ 15132
stat -c %s cesta | numfmt --to iec⊨ 15K
@vlastník (jméno/UID)#4
stat -c %U cesta⊨ filip
stat -c %u cesta⊨ 1000
@skupina (název/GID)#5
stat -c %G cesta⊨ www-data
stat -c %g cesta⊨ 33
@datum a čas poslední změny (pro člověka či skript/časová známka Unixu)#6
stat -c %y cesta⊨ 2020-03-01 05:30:59.280255271 +0100
stat -c %Y cesta⊨ 1583037059
@kanonická cesta adresářové položky (v případě symb. odkazu vzít: odkaz/odkazovanou položku)#7
realpath -s [--] cesta
realpath [--] cesta
@počet pevných odkazů#8
stat -c %h cesta⊨ 1
@číslo inode#9
stat -c %i cesta⊨ 403723
@typ adresářové položky (písmeno/čitelně pro člověka)#10
stat -c %A | cut -c 1 | tr - f⊨ f
stat -c %F cesta⊨ běžný soubor
@příslušný přípojný bod (kořenový adresář systému souborů, na kterém se položka nachází)#11
stat -c %m cesta⊨ /
@prostor skutečně zabraný na disku souborem (v bajtech/čitelně pro člověka)#12
stat -c '%b*%B' cesta | bc⊨ 16384
stat -c '%b*%B' cesta | bc | numfmt --to iec⊨ 16K
@nastavené rozšířené zvláštní příznaky (pro člověka/pro skript)#13 (2)
lsattr -d [--] cesta
lsattr -d [--] cesta | sed -zE 's/-//g;s/\s.*/\n/'

3/6 Aktuální adresář

@přejít do daného adresáře/na předchozí aktuální adresář#1
cd [--] cesta
cd -
@zjistit aktuální adresář#2
pwd⊨ /home/aneta
@přejít do domovského adresáře#3
cd
@přejít o úroveň výš#4
cd ..
@přejít do kořenového adresáře#5
cd /
@přejít do předchozího aktuálního adresáře dané instance interpretu#6
cd -

3/7 Vytvořit adresářovou položku

@vytvořit prázdný adresář (alternativy)#1 (3)(4)
mkdir [-v] [-m práva] [-p] název
mkdir [-v] -m [=]mód [-p] název
@vytvořit prázdný soubor#2
touch název
@vytvořit symbolický odkaz#3
ln -s "obsah/odkazu" název
@vytvořit soubor vyplněný nulami (velikost zadat/odvodit)#4 (5)
rm -f [--] cesta/k/souboru && truncate -s velikost cesta/k/souboru
rm -f [--] cesta/k/souboru && truncate -r cesta/ke/vzorovému/souboru cesta/k/souboru
@vytvořit pojmenovanou rouru#5
mkfifo [-m práva] název

3/8 Přejmenovat či smazat adresářovou položku

@přejmenovat adresářovou položku#1
mv [parametry] [--] původní-název nový-název
@smazat neadresář#2
rm [-f] [--] cesta
@smazat prázdný adresář#3
rmdir [--] cesta
@smazat rekurzivně veškerý obsah adresáře a nakonec i samotný adresář#4 (6)
rm -r[f][v] [--] cesta

3/9 Nastavit přístupová práva

@nastavit práva „rwx“ pro vlastníka, „rx“ pro skupinu a nic pro ostatní (alternativy)#1
[sudo] chmod [-R] u=rwx,g=rx,o=- [--] cesta
[sudo] setfacl [-R] u::rwx,g::rx,o::- [--] cesta
@odebrat všem všechna práva#2
[sudo] setfacl [-R] -bm u::-,g::-,o::- [--] cesta
@přidat/odebrat vlastníkovi právo „x“#3
[sudo] chmod [-R] u+x [--] cesta
[sudo] chmod [-R] u-x [--] cesta
@přidat/odebrat vlastníkovi a skupině právo „x“#4
[sudo] chmod [-R] ug+x [--] cesta
[sudo] chmod [-R] ug-x [--] cesta
@přidat/odebrat všem práva „r“ a „x“#5 (7)
[sudo] chmod [-R] a+rx [--] cesta
[sudo] chmod [-R] a-rx [--] cesta
@nastavit mód (základní přístupová práva a základní zvláštní příznaky)#6 (8)
[sudo] chmod [-R] =mód [--] cesta
@nastavit práva „rwx“ pro vlastníka a „rx“ pro ostatní, práva pro skupinu neměnit (alternativy)#7
[sudo] chmod [-R] u=rwx,o=rx [--] cesta
[sudo] setfacl [-R] -m u::rwx,o::- [--] cesta
@nastavit rozšířená práva „rx“ uživateli „filip“#8
[sudo] setfacl [-R] -m u:filip:rx [--] cesta
@zrušit rozšířená práva uživatele „filip“#9
[sudo] setfacl [-R] -x u:filip [--] cesta
@zrušit rozšířená práva všech uživatelů a skupin#10
[sudo] setfacl [-R] -b [--] cesta
@nastavit skupině („g“) a ostatním („o“) přístupová práva, jaká má vlastník („u“) (alternativy)#11
[sudo] chmod [-R] go=u [--] cesta
[sudo] getfacl [--] cesta | sed -nE 's/^user::/g::/;T;p;s/^[^:]+/o/;p' | [sudo] setfacl -M- [--] cesta

3/10 Změnit čas, vlastnictví a skupinu

@nastavit čas „změněno“/čas „čteno“/oba časy na aktuální čas#1
[sudo] touch -cm [--] cesta
[sudo] touch -ca [--] cesta
[sudo] touch -c [--] cesta
@změnit vlastníka souboru či adresáře (volitelně i skupinu)(obecně/příklad)#2
sudo chown [-R [-L]] [-c] [--from=[původní-vlastník]:[původní-skupina]] nový-vlastník[:nová-skupina] [--] cesta
sudo chown root:root soubor.txt
@změnit skupinu souboru či adresáře#3
[sudo] chgrp [-R] [-c] nová-skupina [--] cesta
@přenést čas „změněno“/„čteno“/oba časy ze zdrojového souboru či adresáře#4
[sudo] touch -cm -r zdrojová/položka [--] cesta
[sudo] touch -ca -r zdrojová/položka [--] cesta
[sudo] touch -c -r zdrojová/položka [--] cesta
@nastavit čas „změněno“ (obecně/příklady...)#5 (9)
[sudo] touch -cmd "datum-čas" [--] cesta
sudo touch -cmd "2019-04-21 23:59:58" -- /root/mujsoubor.txt
touch -cmd "2019-04-21 23:59:58.123456789" -- ~/mujsoubor.txt
touch -cmd "2019-04-21 23:59:58.123456789 +0200" -- ~/mujsoubor.txt
@nastavit čas „čteno“/oba časy#6
[sudo] touch -cad "datum-čas" [--] cesta
[sudo] touch -cd "datum-čas" [--] cesta

3/11 Zvláštní příznaky (nastavit)

@zapnout/vypnout příznak omezení smazání (+t)#1
[sudo] chmod [-R] +t [--] cesta
[sudo] chmod [-R] -t [--] cesta
@zapnout/vypnout příznak zmocnění skupiny (g+s)#2
[sudo] chmod [-R] g+s [--] cesta
[sudo] chmod [-R] g-s [--] cesta
@zapnout/vypnout příznak zmocnění vlastníka (u+s)#3
[sudo] chmod [-R] u+s [--] cesta
[sudo] chmod [-R] u-s [--] cesta
@zapnout/vypnout současně všechny tři základní zvláštní příznaky#4
[sudo] chmod [-R] ug+s,+t [--] cesta
[sudo] chmod [-R] ug-s,-t [--] cesta
@zapnout/vypnout rozšířené zvláštní příznaky#5 (10)
sudo chattr [-R] +příznak[dalšípříznak] [--] cesta
sudo chattr [-R] -příznak[dalšípříznak] [--] cesta

3/12 Ostatní

@kolik je v adresáři položek? (včetně skrytých, ale bez „.“ a „..“)#1
find adresář -mindepth 1 -maxdepth 1 -printf \\0 | wc -c
@kolik je v adresáři neskrytých souborů/adresářů (bez symbolických odkazů)?#2
find adresář -mindepth 1 -maxdepth 1 -type f -name '[!.]*' -printf \\0 | wc -c
find adresář -mindepth 1 -maxdepth 1 -type d -name '[!.]*' -printf \\0 | wc -c
@kolik je v adresáři neskrytých souborů/adresářů (včetně symbolických odkazů)?#3
find -L adresář -mindepth 1 -maxdepth 1 -type f -name '[!.]*' -printf \\0 | wc -c
find -L adresář -mindepth 1 -maxdepth 1 -type d -name '[!.]*' -printf \\0 | wc -c

4. Zaklínadla: Uživatelské datové položky

Poznámka: Znaky „\r“, „\n“, „=“ a „\“ se v klíčích atributů při použití následujících zaklínadel nahrazují sekvencemi „\015“ (\r), „\012“ (\n), „\075“ (=), resp. „\134“(„\“). Příkaz „getfattr“ je již automaticky nahrazuje ve výpisech a příkaz „setfattr“ očekává klíč s nahrazenými znaky. Buď se použití těchto znaků vyhněte, nebo jim zajistěte odpovídající konverzi. Nulový bajt „\0“ se v klíči vyskytovat nemůže.

Podle manuálové stránky je délka klíče omezena na 256 bajtů a délka hodnoty na 64 kibibajtů.

4/1 Vypsat položky

@vypsat klíče všech souborů a podadresářů (spíš pro člověka)#1
[sudo] getfattr -PR --absolute-names [--] cesta/adresáře
@vypsat klíče i hodnoty pro člověka (řetězcově/hexadecimálně)#2
[sudo] getfattr --dump [-m -] [--] cesta
[sudo] getfattr --dump -e hex [-m -] [--] cesta
@vypsat klíče (pro člověka)#3
[sudo] getfattr [--] cesta
@vypsat klíče (pro skript, ukončovač „\n“)#4
[sudo] getfattr [--] cesta | sed -E '1d;$d'
@má datové položky (uživatelské/uživatelské nebo systémové)?#5
[sudo] getfattr [--] cesta | egrep -zq .
[sudo] getfattr -m - [--] cesta | egrep -zq .
@počet klíčů (jen číslo/číslo a adresářová cesta)#6
[sudo] getfattr [-m -] [--] adr/položka | sed -E '1d;$d' | wc -l

4/2 Smazat položku

@smazat všechny#1 (11)
jmeno=$(realpath [--] cesta)
[sudo] getfattr [--] "$jmeno" | sed -E $'1d;$d' | (export LC_ALL=C; while read -r klic; do setfattr -x "$klic" -- "$jmeno"; done)
@smazat#2
[sudo] setfattr -x klíč [--] adr/položka

4/3 Přečíst položku

@získat hodnotu datové položky#1 (12)
[sudo] getfattr --only-values -n klíč [--] adr/položka | zpracování
@načíst klíče a hodnoty do asociativního pole bashe (nulové bajty nahradit za „\n“)#2
@načíst klíče do pole bashe#3
@délka hodnoty v bajtech#4
[sudo] getfattr --only-values -n klíč [--] adr/položka | wc -c

4/4 Vytvořit či přepsat položku

@nastavit datovou položku (hodnota je text/binární data)#1
[sudo] setfattr -n klíč -v "0x$(printf %s "text" | xxd -p -c 1 | tr -d \\n)" [--] adr/položka
[sudo] setfattr -n klíč -v "0x$(zdroj | xxd -p -c 1 | tr -d \\n)" [--] adr/položka

5. Parametry příkazů

5/1 chmod

chmod [parametry] [=]mód [--] cesta
chmod [parametry] nastavení,práv,a,příznaků [--] cesta

Příklady, jak může vypadat nastavení práv a příznaků najdete v zaklínadlech. Mód je číselné vyjádření základních práv a zvláštních příznaků v osmičkové soustavě.

☐ -RJe-li argumentem adresář, provede stejné nastavení i na všech jeho položkách, položkách všech podadresářů a tak dále.
☐ -vVypisovat provedené operace.

5/2 mkdir

☐ -pVytvoří adresář, pokud ještě neexistuje. Je-li to třeba, vytvoří i nadřazené adresáře.
☐ -vVypisovat provedené operace.
☐ -m právaVytvořenému adresáři nastaví uvedený mód. Ten může být zadán symbolicky (např. „u=rwx,g=rx,o=“) nebo číselně (např. „755“).

5/3 setfacl

setfacl [parametry] -m "nastavení práv" [--] cesta
setfacl [parametry] -M soubor [--] cesta
setfacl [parametry] -x "práva ke zrušení" [--] cesta
setfacl [parametry] -X soubor [--] cesta
setfacl [parametry] -M- [--] cesta
setfacl --restore=soubor
☐ -b ☐ -kOdstraní všechna rozšířená/výchozí přístupová práva.
☐ -dUvedená normální přístupová práva nastaví jako „výchozí“.
☐ -RJe-li argumentem adresář, provede stejné nastavení i na všech jeho položkách, položkách všech podadresářů a tak dále.

6. Instalace na Ubuntu

Všechny použité nástroje jsou základními součástmi Ubuntu, s výjimkou příkazů „tree“, „getfattr“ a „setfattr“, které můžete doinstalovat takto:

sudo apt-get install tree attr

7. Tipy a zkušenosti

  • Vlastníci a skupiny jsou v souborovém systému uloženy ve formě čísel UID a GID. Proto když uložíte soubor na USB flash disk a přenesete ho na jiný počítač, kde pracujete jako uživatel s jiným UID, může se stát, že tam k souborům na flash disku nebudete mít dostatečná přístupová práva.
  • Symbolické odkazy mají vlastníka a skupinu, ale nemají vlastní přístupová práva. Přístup k odkazované položce se vždy řídí jejími přístupovými právy, čtení symbolického odkazu je bez omezení a zápis do něj není dovolen (je nutno místo toho odkaz smazat a vytvořit nový).
  • Příznaky zmocnění vlastníka a skupiny jsou u souboru (vždy oba) automaticky odebrány, kdykoliv se změní jeho vlastník či skupina. U adresáře jsou v takové situaci ponechány.
  • V linuxu existují také „výchozí přístupová práva“, což je nastavení přístupových práv na adresáři, které (je-li nastaveno) ovlivňuje přístupová práva nově vyvářených položek; bohužel nelze říci „stanovuje“, ale platí pouze „ovlivňuje“ – na výsledných právech se podílejí i další faktory, nelze rozlišit práva pro soubory a pro adresáře a celé je to dost komplikované a neintuitivní. Zatím jsem naštěstí nanarazil/a na případ, kdy by tuto vlastnost skutečně nějaký program použil.

8. Další zdroje informací

9. Zákulisí kapitoly

V této verzi kapitoly chybí:

  • Kdo má právo nastavovat příslušnou skupinu?
  • kopírování (bude samostatná kapitola).
  • hledání a eliminace duplikátů (pevné odkazy/btrfs klony)

Tato kapitola záměrně nepokrývá:

  • pevné a symbolické odkazy (mají vlastní kapitolu)
  • připojováním souborových systémů či prací s pododdíly btrfs (mají vlastní kapitolu)
1 Poznámka: příkaz „find“ odzvláštňuje speciální znaky na svém výstupu, pokud je veden na terminál. Je-li toto chování nežádoucí, nechte jeho výstup ještě projít dalším filtrem, např. „cat“.
2 Poznámka: některé rozšířené zvláštní příznaky jsou pouze informativní a nemohou být přímo změněny žádným příkazem.
3 Parametr „-p“: vytvořit adresář, jen pokud ještě neexistuje; a v případě potřeby nejdřív vytvořit adresáře jemu nadřazené.
4 Znak „=“ u módu má význam pouze v případě, že chcete zabránit, aby vytvořený adresář zdědil od nadřazeného adresáře příznak zmocnění skupiny. Bez = se totiž v takovém případě tento příznak zdědí i v případě, že ho uvedený mód nemá nastavený. Pokud „=“ uvedete, dědění se tím zabrání a příznak se nastaví výhradně podle uvedeného módu.
5 Poznámka: Je-li to možné, příkaz „truncate“ vytvoří takzvaný „řídký soubor“, tedy soubor, který ve skutečnosti zprvu nezabírá žádné místo na disku a jeho datové bloky se alokují teprve při zápisu. Tím pádem také umožňuje vytvořit soubor větší než je velikost souborového systému. Pokud chcete pro soubor rovnou vyhradit i prostor na disku, místo „truncate -s“ použijte „fallocate -l“.
6 Tuto variantu můžete použít i na jednotlivé soubory.
7 Pozor! Pokud má některý uživatel dané právo výslovně odebrané položkou rozšířených přístupových práv, uvedený příkaz na přidání práv všem mu ho nepřidá.
8 Mód můžete zadat i bez znaku „=“, ale v takovém případě by tento příkaz neodstranil ze souborů a adresářů příznaky zmocnění vlastníka a skupiny; příznak omezení smazání by se odstranil i v takovém případě.
9 Pozor! Příkaz „touch“ při tomto použití tiše ignoruje neexistující soubory! Neuvedete-li u času posun, bude se interpretovat v místní časové zóně (podle proměnné prostředí „TZ“).
10 Pozor! Tímto příkazem nemůžete měnit základní zvláštní příznaky! Obzvlášť nebezpečná záměna hrozí u příznaku „t“, protože existuje základní příznak „+t“ a současně i nesouvisející rozšířený zvláštní příznak „t“.
11 Poznámka: mám podezření, že tento příkaz nedokáže odstranit některé datové položky, jejichž názvy obsahují sekvence bajtů neplatné v UTF-8. Pro potvrzení nebo vyvrácení tohoto podezření by bylo potřeba další náročné experimentování.
12 Poznámka: hodnotou mohou obecná binárná data. Nepředpokládejte, že obsahuje text v kódování UTF-8 nebo že neobsahuje nulové bajty!
[BY-SA]

Veškerý obsah této stránky (text, obrázky, zdrojový kód) je možno upravovat a šířit pod podmínkami licence Creative Commons Attribution-ShareAlike 4.0 International. Upozorňuji, že uvedená licence vyžaduje uvedení seznamu autorů, licence a zdroje a poskytnutí stejné či kompatibilní licence k provedeným změnám, jsou-li nějaké. Příslušné údaje jsou dostupné na stránce „Přehled autorů“. Šíření obsahu bez těchto údajů nebo šíření upravené verze bez poskytnutí adekvátní licence k provedeným úpravám je pravděpodobně porušení licenčních podmínek a může být postihováno. Poskytování zdrojového kódu při šíření není touto licencí vyžadováno.

Pro nové verze, další informace, aktuální zdrojový kód a možnost se zapojit do projektu „Linux: Kniha kouzel“ navštivte jeho repozitář na GitHubu.