Shell Prakticky
Přístupová práva a
příkaz find

Lukáš Bařinka

Cíl

Cílem je vyzkoušet si prakticky přístupová práva a fungování příkazu find

Obsah

  • Přístupová práva
  • Příkaz find

Část 1

Přístupová práva

Úloha 01

Vytvořte adresář perms a v něm soubory se jmény od rwxrwxrwx až po --------- . Spočítejte počet vytvořených souborů.


							~mkdir perms
							~cd perms
							~/permstouch -- {r,-}{w,-}{x,-}{r,-}{w,-}{x,-}{r,-}{w,-}{x,-}
							~/permsls | wc -l

							~/permsc=0; for i in *; do ((c++)); done; echo $c
						

Úloha 02

Nastavte každému ze souborů taková přístupová práva, která odpovídají jeho jménu.

  1. Vypište každé jméno souboru ve for cyklu.
  2. Jméno souboru rozdělte po 3 znacích a vypište ve formátu u=123,g=456,o=789 , kde čísla 1-9 představují 1. až 9. znak.
  3. Ve výpisu odstraňte znaky - .
  4. Výpis použijte jako argument příkazu chmod pro nastavení práv souboru.

							~/permsfor i in *; do
							           P=$( sed -r '
							                    s/(...)(...)(...)/u=\1,g=\2,o=\3/
							                    s/-//g
							                ' <<<"$i" )
							           chmod -- "$P" "$i"
							       done
						

Úloha 03

Pomocí příkazů ls -l a awk vypište, na kterých řádcích práva neodpovídají jménu souboru.


							~/permsls -l | awk '$1 != "-"$NF'
						

Úloha 04

Vypište jména souborů v pořadí podle přístupových práv/jména od --------- po rwxrwxrwx .


							~/permsls | tr - a | sort | tr a -

							~/permsstat -c '%03a %n' -- * | sort | cut -c5-
						

Úloha 05

Pro každý soubor vypište ve for cyklu jeho přístupová práva v oktalové podobě.


							~/permsfor i in *; do stat -c "%a" -- "$i"; done
						

Úloha 06

Do každého souboru napište náhodný počet mezer (max 99).

Pozor na soubory, u kterých nemáte právo zápisu. Problém vyřešte i pro ně tak, aby na konci zůstaly každému souboru původní přístupová práva.


							~/permsfor i in *; do
							           P=$( stat -c "%a" -- "$i" )
							           chmod 600 -- "$i"
							           printf -- "%$((RANDOM%100))s" > "$i"
							           chmod "$P" -- "$i"
							       done
						

Úloha 07

Obnovte všem souborům výchozí přístupová práva (podle masky přístupových práv).


							~/permschmod 0 -- *; chmod +rwX -- *

							~/permschmod 0 -- *; chmod $( umask -S | tr x X ) -- *
						

Úloha 08

Vytvořte v domovském adresáři adresář x a v něm soubory se všemi možnými právy, jejichž jméno bude odpovídat symbolickému zápisu práv a uvnitř bude počet mezer, který bude odpovídat oktalovému zápisu práv souboru.


							~/permscd; mkdir x; cd x
							~/xfor ((i=0;i<2**12;i++)); do
							       printf -v p '%o' $i
							       printf "%${p}s" > new
							       chmod $p new
							       P=$( stat -c %A new )
							       mv -f -- new "${P#-}"
							   done
						

Úloha 09

Vytvořte podadreáře 000, 100, 200, ..., 700 a spec.


							~/xmkdir {000..700..100} spec

							~/xfor ((i=0; i<=700; i+=100)); do
							       mkdir $(printf '%03d' $i)
							   done
							~/xmkdir spec
						

Úloha 10

Přesuňte obyčejné soubory do vytvořených podadresářů podle práv souborů.


							~/xfor i in ?????????; do
							       p=$( stat -c %03a -- "$i"  )
							       case $p in
							           ???) dest=${p:0:1}00;;
							           *) dest=spec;;
							       esac
							       mv -- "$i" "$dest"
							done
						

Část 2

Příkaz find

Úloha 11

Pomocí příkazu find vypište podrobnosti obyčejných souborů, které jsou prázdné.


							~/xfind . -type f -size 0 -ls
						

Úloha 12

Pomocí příkazu find vypište podrobnosti obyčejných souborů, které jsou prázdné. Na konci výpisu napište kolik % souborů takových je.


							~/xn=$( find . -type f | wc -l )
							~/xfind . -type f -size 0 -ls \
							   | awk "1; END { print 100*NR/$n \" %\" }"

							~/xfind . -type f -ls \
							   | awk '
							          $2 == 0 { print; c++ }
							          END { print 100*c/NR " %" }
							     '
						

Úloha 13

Vyřešte předchozí příklad na jeden průchod, ale tak, aby testování velikosti prováděl příkaz find.


							~/xfind . -type f -print -size 0 -ls \
							   | awk '
							          NF != 1 { print; c++ }
							          END { print 100*c/(NR-c) " %" }
							     '

							~/xfind . -type f -printf '\n' -size 0 -ls \
							   | awk '
							          NF > 0 { print; c++ }
							          END { print 100*c/(NR-c) " %" }
							     '
						

Úloha 14

Vypište podrobnosti u obyčejných souborů, jejichž velikost je sudá.


							~/xfind . -type f -ls | awk '$7 ~ /[02468]$/'
						

Úloha 15

V domovském adresáři vytvořte skript suda , který skončí úspěšně, pokud velikost souboru z prvního argumentu je sudá, jinak skončí neúspěšně.


							~/xvim ~/suda

							#!/bin/bash
							stat -c "%s" -- "$1" | grep -q '[02468]$'

							~/xchmod +x ~/suda
						

Úloha 16

Vypište podrobnosti u souborů, jejichž velikost je sudá s použitím příkazu find a skriptu ~/suda .


							~/xfind . -type f -exec ~/suda {} \; -ls
						

Úloha 17

Vypište jména obyčejných souborů, které jsou pro vlastníka čitelné.


							~/xfind . -type f -perm -u=r

							~/xfind . -type f -readable
						

Úloha 18

Vypište jména obyčejných souborů, které jsou pro všechny čitelné.


							~/xfind . -type f -perm -u=r,g=r,o=r
						

Úloha 19

Vypište jména obyčejných souborů, které jsou čitelné alespoň pro někoho.


							~/xfind . -type f -perm /u=r,g=r,o=r
						

Úloha 20

Vypište jména souborů, které jsou pro vlastníka čitelné a na konci vypište jejich počet.


							~/xfind . -type f -perm -u=r | sed '${p;=;d}'
						

Úloha 21

Vypište jména souborů, které jsou čitelné alespoň pro někoho a na konci vypište jejich počet.


							~/xfind . -type f -perm /a=r | sed '${p;=;d}'
						

Úloha 22

Vypište jména souborů, které nejsou pro nikoho čitelné a na konci vypište jejich počet.


							~/xfind . -type f ! -perm /a=r | sed '${p;=;d}'
						

Úloha 23

Vypište jména souborů, které mají minimálně pro někoho všechna práva a na konci vypište jejich počet.


							~/xfind . -type f \( -perm -700 -o -perm -070 -o -perm -007 \) \
							   | sed '${p;=;d}'
						

Úloha 24

Ověřte, že předchozí řešení je správné.


							~/xfind . -type f | grep -c rw[xst]