Linux: Kniha kouzel, vanilková příchuť 1.17 (27. února 2022)
Veškerá moc příkazové řádky/příkazového řádku přehledně, pro začátečníky i pokročilé

16. Soubory a adresáře

Řada 1.x vanilkové příchuti Linuxu: Knihy kouzel je od 1. října 2020 do 1. března 2023 ve stavu dlouhodobé pasivní údržby; nahlášené chyby budou opravovány, ale aktivní vývoj se již věnuje novější vývojové řadě určené pro novější verze operačního systému a programů. Pokud nejste vázáni na starší verze programů, doporučuji vyhledat novou verzi z aktivně vyvíjené vývojové řady.
adresáře přístupová práva soubory tematický okruh

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 rozšířených atributů. Nepokrývá však zacházení s konkrétním obsahem souborů (analýzu, kopírování, zálohování apod.).

Pevnými a symbolickými odkazy se tato kapitola zabývá velmi okrajově, bude jim věnována samostatná kapitola.

Tato kapitola se nezabývá připojováním souborových systémů.

Tato verze kapitoly dostatečně nepokrývá „mód“ (číselné vyjádření základních přístupových práv a zvláštních příznaků).

2. Definice

2/1 Přístupová práva souborů a adresářů

V linuxovém souborovém systému existují tři přístupová práva, která lze u adresářové položky dovolit či zakázat:

Právo čtení (r, read) znamená:

Právo zápisu (w, write) znamená:

Právo spouštění (x, execute) znamená:

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.

Z historických důvodů existují dvě nastavení přístupových práv – základní (mode) a rozšířené (ACL). Základní nastavení je vždy přítomno a dělí se na nastavení pro vlastníka („u“), skupinu („g“) a ostatní („o“). Rozšířené nastavení je pak tvořeno seznamem 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ě:

2/2 Zvláštní příznaky

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

Příznak zmocnění vlastníka (u+s, set-uid bit) má význam pouze u souborů a 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.

Příznak zmocnění skupiny (g+s, set-gid bit) funguje u souborů analogicky – spustí-li daný soubor kterýkoliv uživatel, vzniklý proces získá EGID (tedy skupinová práva) skupiny souboru. Navíc ovšem funguje i u adresářů – všechny nově vytvořené adresářové položky v adresáři s příznakem zmocnění pro skupinu 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.

Třetí zvláštní příznak je příznak omezení smazání (+t, sticky-bit). Ten má význam pouze u adresářů, kde 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 z přístupových práv a příznaků vztahuje pouze právo spouštění u souborů a příznak zmocnění pro skupinu. Ostatní nastavení přístupových práv ani příznaků ho nijak neomezují a nemají na něj vliv.

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[a][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ář/symbolický odkaz/pojmenovaná roura?#2
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 soubor neprázdný/prázdný?#3
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?#4
[[ $(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
počet pevných odkazů#7
stat -c %h cesta⊨ 1
číslo inode#8
stat -c %i cesta⊨ 403723
typ adresářové položky (písmeno/čitelně pro člověka)#9
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í)#10
stat -c %m cesta⊨ /
prostor skutečně zabraný na disku souborem (v bajtech/čitelně pro člověka)#11
stat -c '%b*%B' cesta | bc⊨ 16384
stat -c '%b*%B' cesta | bc | numfmt --to iec⊨ 16K

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 ..

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

vytvořit prázdný adresář#1 (2)
mkdir [-v] [-m práva] [-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 pojmenovanou rouru#4
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 rekurzívně veškerý obsah adresáře a nakonec i samotný adresář#4 (3)
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
[sudo] chmod [-R] a+rx [--] cesta
[sudo] chmod [-R] a-rx [--] cesta
nastavit práva „rwx“ pro vlastníka a „rx“ pro ostatní, práva pro skupinu neměnit (alternativy)#6
[sudo] chmod [-R] u=rwx,o=rx [--] cesta
[sudo] setfacl [-R] u::rwx,g::rx,o::- [--] cesta
nastavit rozšířená práva „rx“ uživateli „filip“#7
[sudo] setfacl [-R] -m u:filip:rx [--] cesta
zrušit rozšířená práva uživatele „filip“#8
[sudo] setfacl [-R] -x u:filip [--] cesta
zrušit rozšířená práva všech uživatelů a skupin#9
[sudo] setfacl [-R] -b [--] cesta

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

nastavit čas poslední změny na aktuální čas#1
[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
nastavit čas poslední změny (obecně/příklady...)#4 (4)
[sudo] touch -cd "datum-čas" [--] cesta
sudo touch -cd "2019-04-21 23:59:58" -- /root/mujsoubor.txt
touch -cd "2019-04-21 23:59:58.123456789" -- ~/mujsoubor.txt

3/11 Přenést přístupová práva

nastavit skupině („g“) a ostatním („o“) přístupová práva, jaká má vlastník („u“) (alternativy)#1
[sudo] chmod [-R] go=u [--] cesta
[sudo] getfacl [--] cesta | sed -E 's/^user::/other::/;t;d' | [sudo] setfacl -M- cesta

3/12 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 zvláštní příznaky#4
[sudo] chmod [-R] ug+s,+t [--] cesta
[sudo] chmod [-R] ug-s,-t [--] cesta

3/13 Uživatelské rozšířené atributy ext4 (URA)

Poznámka: Tyto příkazy jsou vhodné pro zpracování běžných textových hodnot rozšířených atributů; pokud potřebujete zpracovávat atributy obsahující obecná binární data, budete muset prozkoumat komplikovanější příkazy „getfattr“ a „setfattr“ z balíčku „attr“ (nutno doinstalovat).

Poznámka 2: Všechny klíče uživatelských rozšířených atributů musejí začínat „user.“.

vypsat seznam klíčů#1
[sudo] xattr [--] cesta
vypsat hodnotu#2
[sudo] xattr -p[z] [--] user.klíč cesta
smazat konkrétní URA-dvojici#3
[sudo] xattr -d [--] user.klíč cesta
smazat všechny URA-dvojice na daném souboru či adresáři#4
nastavit atribut#5
[sudo] xattr -w[z] [--] user.klíč "hodnota" cesta

3/14 Zvláštní restrikce ext4

Pozor! Následující zvláštní restrikce jsou dostupné výhradně na souborovém systému ext4 (a pravděpodobně také na ext3, popř. ext2); mohou být k dispozici i na jiných souborových systémech, ale většinou nejsou (dokonce ani na „tmpfs“). Účinkují i na superuživatele, ten je však může v případě potřeby zrušit.

nastavit/zrušit zvláštní restrikci zakazující změny#1 (5)
sudo chattr [-R] +i cesta
sudo chattr [-R] -i cesta
nastavit/zrušit zvláštní restrikci změn dovolující jen připojování na konec souboru#2
sudo chattr [-R] +a cesta
sudo chattr [-R] -a cesta
vypsat všechny nastavené zvláštní restrikce ext4#3
[sudo] lsattr adresář-popř.-soubor

3/15 Ostatní

kolik je v adresáři položek?#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. Parametry příkazů

4/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.

4/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“).

4/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.

5. Instalace na Ubuntu

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

sudo apt-get install tree xattr

6. Tipy a zkušenosti

7. Další zdroje informací

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 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é.
3 Tuto variantu můžete použít i na jednotlivé soubory.
4 Pozor! Příkaz „touch“ při tomto použití tiše ignoruje neexistující soubory!
5 Tato zvláštní restrikce zakazuje změny jak v obsahu souboru či adresáře, tak i v jeho vlastní adresářové položce (není možné ji přejmenovat či smazat). Zakazuje i změnu vlastnictví či přístupových práv.
Regulární výrazyProměnné prostředí a interpretuZpracování videa a zvuku