Skoči na vsebino

OS - 2021/22 - 1. domača naloga

DN1a

Skripta prejme en argument: DN1a.sh imenik

Skripta preveri v podanem imeniku koliko imamo navadnih datotek, koliko skritih datotek, koliko mehkih povezav, koliko datotek, ki imajo več kot eno trdo povezavo, koliko cevovodov in koliko imenikov.

Primer
> ./DN1a.sh .
datoteke: 2
skrite: 3
mehke povezave: 1
trde povezave: 2
cevovodi: 1
imeniki: 2
Resitev
#!/bin/bash
set -euo pipefail

echo datoteke: $(ls -Ald $1/?* | grep '^-' | wc -l)
echo skrite: $(ls -pA $1 | grep '^\..*[^/]$' | wc -l)
echo mehke povezave: $(ls -Al $1/. | grep '^l' | wc -l)
echo trde povezave: $(ls -Ald $1/?* | grep '^-' | awk '{ print $2}' | grep -v 1 | wc -l)
echo cevovodi: $(find $1 -type p | wc -l)
echo imeniki: $(ls -Ap $1 | grep '/$' | wc -l)

DN1b

Skripta prejme dva ali več argumentov: DN1b.sh datoteka uporabnik [uporabnik]...

Skripta kot prvi argument prejme pot do datoteke, od drugega argumenta naprej pa dobi seznam uporabnikov. Vsem podanim uporabnikom s pomočjo ACL (Access Control List) dodeli možnost branja in poganjanja datoteke (tudi če niso lastniki datoteke ali člani skupine datoteke; pri čemer pa vsi ostali uporabniki sistema teh dveh pravic ne dobijo). Namig: poiščite ukaz za spreminjanje ACL za datoteko.

Resitev
#!/bin/bash
set -euo pipefail

setfacl -b $1

for i in "${@:2}"
do
        setfacl -m $i:rx $1
done

DN1c

Skripta prejme tri argumente: DN1c.sh imenik končnica niz

V podanem imeniku rekurzivno poiščite vse datoteke s končnico končnica, ki vsebujejo iskani niz. Izpišite najdeno datoteko, številko vrstice, kjer se niz nahaja in vsebino vrstice z označenim iskanim nizom.

Če izvedemo skripto ./DN1c.sh /home/student py "import torch" kot rezultat dobimo:

/home/student/preprocess/crop.py : 2 : import torch
/home/student/preprocess/crop.py : 3 : import torch.backends.cudnn as cudnn

Resitev
#!/bin/bash
set -euo pipefail

grep --include=\*.py -rn /tmp/OS-DN1/ -e "import torch" | sort | awk -F: '/:/{gsub(/:[ ]+/,":"); print $1" : "$2" : "$3}'

DN1d

Skripta nima argumentov:

DN1d.sh

Skripta izpiše seznam vseh uporabnikov in velikost njihovega domačega imenika urejenega po velikosti od tistega, ki zasede največ prostora do najmanj. Velikost izpišite v MB in samo za tiste uporabnike, ki imajo velikost večjo od 1MB.

Primer
> ./DN1d.sh
534140MB borutb
123888MB student
3457MB administrator
Resitev
#!/bin/bash
set -euo pipefail

du -sm /home/* | awk '$1 > 1 { print $1"MB "$2 }' | awk -F"/home/" '{print $1 $2}'

DN1e

Skripta prejme dva argumenta: DN1e.sh imenik1 imenik2

Skripta naredi "pametno" kopijo datotek iz imenik1 v imenik2. Kopirajo se samo tiste datoteke, ki so nove. Se pravi, da še niso v imenik2 ali se je njihova vsebina spremnila. Na koncu program napiše koliko datotek se je uspešno skopiralo.

Primer
> ./DN1e.sh imenik1 imenik2
Uspešno kopiranih 12 datotek.
> ./DN1e.sh imenik1 imenik2
Ni novih datotek.
> touch imenik1/dat.txt
> ./DN1e.sh imenik1 imenik2
Uspešno kopirana 1 datoteka.
> echo "nova vsebina" >imenik1/dat.txt
> ./DN1e.sh imenik1 imenik2
Uspešno kopirana 1 datoteka.
Resitev
#!/bin/bash
# set -euo pipefail

to=$(rsync -ari "$1/" "$2" | grep -v '/$' | wc -l)

if [[ $to = "0" ]]; then echo "Ni novih datotek."
elif [[ $to =~ ^1$|01$ ]]; then echo "Uspešno kopirana $to datoteka."
elif [[ $to =~ ^2$|02$ ]]; then echo "Uspešno kopirani $to datoteki."
elif [[ $to =~ ^[34]$|0[34]$ ]]; then echo "Uspešno kopirane $to datoteke." 
else echo "Uspešno kopiranih $to datotek."
fi

Zadnja posodobitev: April 11, 2022