Cílem je vyzkoušet si prakticky přístupová práva a fungování příkazu find
Přístupová práva
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
Nastavte každému ze souborů taková přístupová práva, která odpovídají jeho jménu.
~/permsfor i in *; do
P=$( sed -r '
s/(...)(...)(...)/u=\1,g=\2,o=\3/
s/-//g
' <<<"$i" )
chmod -- "$P" "$i"
done
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'
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-
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
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
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 ) -- *
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
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
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
Příkaz find
Pomocí příkazu find
vypište podrobnosti obyčejných souborů, které jsou prázdné.
~/xfind . -type f -size 0 -ls
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 " %" }
'
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) " %" }
'
Vypište podrobnosti u obyčejných souborů, jejichž velikost je sudá.
~/xfind . -type f -ls | awk '$7 ~ /[02468]$/'
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
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
Vypište jména obyčejných souborů, které jsou pro vlastníka čitelné.
~/xfind . -type f -perm -u=r
~/xfind . -type f -readable
Vypište jména obyčejných souborů, které jsou pro všechny čitelné.
~/xfind . -type f -perm -u=r,g=r,o=r
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
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}'
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}'
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}'
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}'
Ověřte, že předchozí řešení je správné.
~/xfind . -type f | grep -c rw[xst]