************************** Systemy Operacyjne (2) Laboratorium nr 2 : FIND ************************** Zadania z rozwizaniami ===Part1 by Scoreo======================================================= 1. W zadanym drzewie katalogów usun puste podkatalogi a take podkatalogi, które stały si puste po wczeniej usunitych podkatalogach. #autor: Karol Skorek echo "###Start" # Testowanie poprawnosci argumentow echo "Podano zla liczbe parametrow" echo "Jako parametr nalezy podac katalog" #------------------------------------------------------ erase=1 while [ $erase!= 0 ] erase=0 erase=` nd $1 -type d -empty (while read zmienna rmdir $zmienna erase=1 echo $erase )` #------------------------------------------------------ echo "###End" #autor: ammon if [ $# -ne 1 ]; echo "Podaj 1 parametr - katalog" ; echo "Katalog jest nieprawidłowy" nd $1 -type d -empty -exec \ rmdir -p --ignore-fail-on-non-empty '{}' ';' &> /dev/null
#autor: Andrzej Kaczmarek nd $1 -depth -type d -empty -exec rmdir {} \; 2> /dev/null 2. W obrbie dwóch drzew katalogów znajd pliki o identycznej zawartoci (ale nie koniecznie o identycznych nazwach i połoeniach korzeni drzew) wystpujcych w obu drzewach. Podaj ciek tylko drugiego i pierwszego drzewa. Aby nie porównywa wszystkich plików ze sob jako wstpne kryterium przyjmuje si taka sama ilo plików. Brak. 3. W zadanych dwóch drzewach katalogów znale pliki regularne je rónice, tzn. takie pliki które wystpuj w pierwszym drzewie a nie w drugim i vice versa oraz takie które wystpuj w pierwszym i drugim ale maja inna zawarto. Listowanie wyróni w tych trzech katalogach. #!/bin/sh #autor: Borys Pogoreło if [ $#!= 2 ]; echo "Uycie: $0 <katalog_1> <katalog_2>" exit -1 [! -d $2 ]; echo "Oba parametry musz by katalogami!" exit -1 X=`nd $1 $2 -type f -printf "%P\n" sort uniq -u` echo "*** Pliki z katalogu $1, których nie ma w katalogu $2:" for a in $X; if [ -f "$1/$a" ]; echo $a; ; echo echo "*** Pliki z katalogu $2, których nie ma w katalogu $1:" for a in $X; if [ -f "$2/$a" ]; echo $a; ; X=`nd $1 $2 -type f -printf "%P\n" sort uniq -d` echo echo "*** Pliki zarówno w katalogu $1 i $2, ale o rónej zawartoci:" for a in $X; cmp -s "$1/$a" "$2/$a" if [ $?!= 0 ]; echo $a;
===Part2 by Marek Furtak================================================= 4. Pogrupowa pliki w danym drzewie katalogów według wielkoci na małe (np. 5kB), rednie (1MB) i due (powyej 1MB). Wywietli łczna liczb plików w grupie oraz ich sumaryczn objto. #autor: Jacka if [! $# -eq 1 ] echo "Zla ilosc parametrow" echo "$1 nie jest katalogiem" #le<5k for i in $( nd $1 -type f -size -5k -printf %s\\n); ((rozm+=$i)) ((liczm++)) echo "Liczba plikow malych: $liczm, w sumie zajmuja $rozm bajtow" #5k<le<1024k for i in $( nd $1 -type f -size +5k -size -1024k -printf %k\\n); ((rozs+=$i)) ((liczs++)) echo "Liczba plikow srednich: $liczs, w sumie zajmuja $rozs kilobajtow" #le>1024k for i in $( nd $1 -type f -size +1024k -printf %k\\n); ((rozd+=$i)) ((liczd++)) echo "Liczba plikow duzych: $liczd, w sumie zajmuja $rozd kilobajtow" 5. Znale wszystkie pliki nalece danego uytkownika policzy je i zsumowa rozmiar. #autor: Jacka if [ $#!= 2 ] echo "Zla ilosc parametrow, 1 - katalog, 2 - uzytkownik" echo "Nieprawidlowy katalog" for i in $( nd $1 -type f -user $2 -printf %k\\n );
((roz+=$i)) ((ilosc++)) echo "Do uzytkownika $2 nalezy $ilosc plikow i razem maja $roz kilobajtow" 6. Znale wszystkie pliki danego uytkownika wiksze ni zadana objto (parametr, np. 1 MB, 500 kilo itp.) i spakowa je, aby zajmowały mniej miejsca. #autor: Jackal if [ $#!= 3 ] echo "Zla ilosc parametrow, 1 - katalog 2 - uzytkownik, 3 - objetosc pliku" echo "Nieprawidlowy katalog" nd $1 -type f -user $2 -size +$3k -print0 cpio --create --null -- format=crc --le=$1.cp ===Part3 by Andrzej Kaczmarek============================================ 7. Poda wszystkie twarde wiazania danego pliku. #autor: Jackal echo "Zla ilosc parametrow" if [! -f $1 ] echo "Nieprawidlowy plik" (( i = $( nd $1 -printf %i\\n ) )) nd $1 -inum $i #autor: A. Kaczamrek nd / -inum $(stat -c %i $1) 2> /dev/null (tu drobne załoenie: mamy tylko jeden lesystem, ale jest to załoenie słuszne i akceptowane przez dr Maciejewskiego ;)
===Part4 by Zetor======================================================== 8. Zmieni rozszerzenia wszystkich plików regularnych o ustawionym prawie wykonywania przez wszystkich, które maja zadane w drugim parametrze rozszerzenie na taka sama nazw ale o rozszerzeniu podanym w trzecim parametrze. #autor: swr nd $1 -type f -perm +001 -name "*.$2" awk -F "." 'NF>1{NF--; OFS="."; print; }' while read plik mv "$plik.$2" "$plik.$3" 9. Wylistuj (w porzdku liczby wystpie) nazwy wszystkich plików regularnych w zadanym drzewie katalogów. We pod uwag jedynie pliki regularne o wielkoci wikszej od 0. #autor: bamboosz echo "Start" echo "====================================" echo "==============pliki:================" # Testowanie poprawnosci argumentow echo "Podano zla liczbe parametrow" echo "Jako parametr nalezy podac katalog" nd $1! -empty -type f -printf %f\\n sort uniq -c echo "====================================" echo "End" #!/bin/sh #autor: Borys Pogoreło ; echo "Nie podano katalogu!" exit -1 ; echo "Podany parametr nie jest katalogiem!" exit -1 nd $1 -type f -size +0 -printf "%f\n" sort uniq -c sort -nr cut - c 9-
#autor: Staszek echo "Poprawne uruchomienie $0 [katalog]"; ; el echo "Podany katalog nie istnieje"; ; nd $1 -type f! -empty sort uniq -c 10. Wylistowa w zadanym drzewie katalogu 3 najwiksze i 3 najmniejsze pliki regularne. #!/bin/sh #autor: Staszek echo "Poprawne uzycie $0 [katalog]" ; el echo "Podany katalog nie istnieje"; ; echo "========== 3 najwieksze pliki w katalogu $1 ==================" licznik=1; nd $1 -type f ls -S while read plik echo "$licznik. $plik"; (( licznik=$licznik+1 )); if [ $licznik == 4 ] break; echo "========== 3 najmniejsze pliki w katalogu $1 =================" licznik=1 nd $1 -type f ls -Sr while read plik echo "$licznik. $plik"; (( licznik=$licznik+1 )); if [ $licznik == 4 ] break;
11. Znale pliki regularne tekstowe o wielkoci >5kB. Plik tekstowy to taki, którego pierwszy wiersz zawiera nie wicej ni 120 znaków. #autor: bamboosz echo "Start" echo "====================================" echo "========pliki teskstowe to:=========" # Testowanie poprawnosci argumentow echo "Podano zla liczbe parametrow" echo "Jako parametr nalezy podac katalog" for i in $( nd $1 -type f -size -5k ); declare -i val (( val = $(head --lines=1 $i wc -c) )) if [ $val -le 120 ]; echo $i :: $val echo "====================================" echo "End" #autor: Staszek echo "Poprawne uzycie $0 [katalog]" ; el echo "Podany katalog nie istnieje!"; ; nd $1 -type f -size +1 while read plik if [ `head --lines=1 $plik wc -c` -le 120 ] echo $plik;
12. W zadanym drzewie katalogu znale pliki o wielkoci >1kB i <20kB (>1b i <500b) posiadajce pojedynczy znak. w nazwie (tzn. z jednym rozszerzeniem). #autor: Staszek echo "Poprawne uzycie $0 [katalog]"; ; el echo "Podany parametr nie jest katalogiem"; ; nd $1 -type f -size +1c -size -500c -name '*.*'! -name '*.*.*' #!/bin/sh #autor: Robert Porba if [ $# -ne 1 ] echo "$0 syntax: $0 directory_name" echo "$1 invalid directory name" nd $1 -type f -size +2 -size -40 -regex '[^.]*\.[^.]*' exit 0 #To zadanie nie koca działa tak jak powinno, ale dr Caban zaliczył je z małym zastrzeeniem. Trzeba troszk zmieni wyraenie regularne. 13.Dla zadanych 2 katalogów wylistuj katalogi o takich samych nazwach i ciekach wzgldnych w ramach drzew. Nie listowa katalogów pustych choby z jednego z drzew. brak
14. W zadanym drzewie katalogów ponumeruj wszystkie pliki regularne (przez danie na kocu datkowego rozszerzenia z numerem) według ich wielkoci od najmniejszego (.1) najwikszego. Numeruj tylko pliki regularne z nieustawionymi bitami wykonania. Pliki o identycznej wielkoci mona numerowa w wolnej kolejnoci. #autor: Staszek echo "Poprawne uzycie $0 [ katalog ]"; ; el echo "Podany katalog nie istnieje"; ; i=0; nd $1 -type f ls -S while read plik echo $plik.$i; # # mv $plik $plik.$i; # (( i=$i+1 )); #!/bin/sh #autor: Robert Porba if [ $# -ne 1 ] echo "$0 syntax: $0 directory_name" echo "$1 invalid directory name" licznik=1 nd $1 -type f! -perm -111 -printf "%s\t%p\n" sort -n cut -f 2 \ while read le mv $le ${le}.$licznik licznik=`expr $licznik + 1` exit 0
===Part5 by Chemical===================================================== 15. W zadanym drzewie katalogów znajd pliki regularne i katalogi o takich samych nazwach takie, e w jednym miejscu jest to plik regularny a w innym katalog. Listuj w postaci: nazwa pliku bez cieki, w nastpnych liniach cieki wzgldem zadanego pocztku drzewa najpierw katalogów o tej nazwie a potem plików regularnych. Nie listuj plików i katalogów o nazwach unikalnych lub takich, e nazwa tyczy tylko plików regularnych lub tylko katalogów. brak =========================================================================== Wielkie dziki dla wszystkich chłopaków za zanotowanie treci zada i ich rozwizanie :) =========================================================================== http://hcg.prv.pl http://hcg.blo.pl