"Prosty" skrypt w powłoce Bash

0

Witajcie, uczę się liceum i na zaliczenie przedmiotu jakim jest informatyka, nauczyciel zlecił nam napisanie skryptu w dowolnej dystrybucji Linuxa w powłoce Bash. Polecenie do zadania brzmi następująco:

Napisz skrypt przyjmujący jeden, dwa lub trzy parametry. Pierwszy parametr może być nazwą katalogu albo opcją "-h". Jeżeli jest nazwą katalogu, zadaniem skryptu jest wyszukanie w tym katalogu podkatalogów pierwszego poziomu zagłębienia i obliczenie, ile zajmują miejsca (w kilobajtach). Wyniki należy wyświetlić na ekranie, posortowane według wielkości. Jeżeli pierwszy parametr to opcja "-h", skrypt powinien obliczyć wielkość (w kilobajtach) katalogów domowych wszystkich użytkowników systemu i posortować je według wielkości.

Stąd kieruję się do Was o pomoc, nigdy nie programowałem w żadnym języku, moja wiedza z informatyki jest dosyć znikoma. Znalazłem kursy pisania skryptów w internecie, udało mi się zainstalować Linuxa na wirtualnej maszynie, lecz jedyne programy w powłoce jakie napisałem to wyświetlanie tekstu i uruchamianie skryptu z wiersza poleceń. Mógłbym Was poprosić o pomoc w napisaniu powyższego programu, lub chociaż nakierowanie mnie na właściwy tor? Pozdrawiam.

2

Pokaż co już napisałeś i wskaż które momenty sprawiaja ci trudność.

Na początek, twój program przyjmuje 1,2 lub 3 argumenty a więc musisz skorzystać z argumentów pozycyjnych. 1 link w google: http://linuxcommand.org/lc3_wss0120.php

Druga sprawa, obliczanie miejsca w danym katalogu. Tutaj przyda ci się aplikacja "du" i prawdopodobnie argument "--max-depth=1"

Trzecia sprawa, posortowane wyniki. Tutaj przyda ci się "sort"

2

Może zacznij od napisania programu który wypisze pierwszy parametr. Potem napisz IF który sprawdzi czy pierwszy parametr jest równy "-h" i wypisz coś innego. Jak Ci się uda napisać taki skrypt daj znać ;)

Ściągawka: http://kurslinux.com/parametry.html

0

A co z pozostałymi dwoma parametrami? Mogą być "dowolne"?

0

Dziękuję za podpowiedzi. Napisałem coś takiego :

#!/bin/bash

echo "Pierwszy wprowadzony argument to $1"
if [ $1 = -h ]
then
echo "Pierwszy argument wynosi -h"
else
echo " argument nie jest rowny -h, jest rowny $1"
echo " Folder $1 zajmuje"
du $1
fi

Używam dystrybucji Linuxa Debian i uruchamiam swój skrypt poprzez konsole poleceniem "./skrypt" po czym po spacji wpisuje argument. Dopisałem taka funkcje jaka poradził mi xDevil2 czyli "du'', ale nie umiem jej zawrzeć w jednej linijce z wyżej zapisanym "echo".

Tylko powiedzcie mi jeszcze jedna rzecz, utworzyłem w katalogu Muzyka plik tekstowy i z konsoli przez polecenie "ls -l" sprawdziłem ile zajmuje ten plik w folderze i pokazuje mi liczbę 96, natomiast jeśli sprawdzam wagę folderu Muzyka poprzez skrypt pokazuje mi liczbę 8 przy poleceniu "du". Gdzieś popełniłem chyba błąd?

Wydaje mi się ze musi być tylko 1 argument, czyli po wywołaniu skryptu i wpisaniu nazwy folderu uruchomię opcje "ls" która w tym katalogu znajdzie podkatalogi, zliczy ich wagę i wyświetli posortowane. A jeśli nie wpiszę nazwy folderu tylko wpiszę "-h" to powinno tylko policzyć i wyświetlić wagę wszystkich katalogów domowych użytkowników. Dodatkowe argumenty to chyba są tylko do tego żeby np policzyć wagę dwóch wpisanych folderów?

Dalej to dla mnie czarna magia, lecz nie ukrywam, że ciekawie wygląda analiza takiego zadania.

Edit:// Przepraszam za złe wstawienie kodu.

1
#!/bin/bash

echo "Pierwszy wprowadzony argument to $1"
if [ $1 = -h ]; then
    echo "Pierwszy argument wynosi -h"
else
    echo "  argument nie jest rowny -h, jest rowny $1"
    echo "  Folder $1 zajmuje  $(du -h --max-depth=0 $1)"
fi

Może coś takiego? Użycie $(KOMENDA) sprawia, że wykonujesz i wypisujesz wynik danej komendy w podanym miejscu.
--max-depth=0 sprawi, że wypisze po prostu rozmiar wskazanego katalogu

EDIT: Chyba nie do końca zrozumiałem to co chcesz wykonać... Chcesz wypisać po prostu rozmiar tego jednego katalogu czy wszystkich katalogów które się w nim znajdują (na poziomie o głębiej)

0

Dziękuję bardzo za ten kod, jesteśmy coraz bliżej rozwiązania, a i ja coraz więcej zaczynam rozumieć.

Chciałbym żeby według treści zadania, po uruchomieniu skryptu z parametrem '-h' skrypt obliczył wielkość wszystkich katalogów domowych użytkowników w kilobajtach i następnie wyświetlił te katalogi posortowane według wielkości.

Natomiast jeśli wpisana zostanie nazwa katalogu jako parametr to żeby skrypt znalazł i policzył wielkość wszystkich podkatalogów pierwszego poziomu zagłębienia i wyswietlil je posrtowane według wielkści (czyli jak dobrze rozumiem mając katalog Dokumenty a w nim katalogi Filmy i Muzyka, skrypt po uruchomieniu parametru Dokumenty powinien policzyc wielkosc tych dwoch folderow wewnatrz niego).

Znów namotałem prawdopodobnie pisząc o funkcji 'ls' ponieważ wydawało mi sie ze tylko dzieki niej moge wyswietlic zawartosci folderów i ich podfolderów wraz z wielkością w kilobajtach.

1

To co napisałeś to jest polecenie du

1

ls nie wyświetla tego ile miejsca zabierają pliki w katalogu a sam "katalog", możesz to zaobserwować korzystając z "ls -l" gdzie jest kilka katalogów każdy bedzie miał prawdopodobnie 4096 rozmiaru.

#!/bin/bash

echo "Pierwszy wprowadzony argument to $1"
if [ $1 = -h ]; then
    echo "Pierwszy argument wynosi -h"
    du -h --max-depth=1 /home/*/ | sort -h -r // To wypisze i posortuje katalogi wszystkich użytkowników, opcja -h sortuje po rozmiarz od najmniejszego, opcja -r odwraca sortowanie.
else
    echo "  argument nie jest rowny -h, jest rowny $1"
    echo "  Folder $1 zajmuje  $(du -h --max-depth=0 $1)" // To wypisze rozmiar katalogu który wybrałeś
    du -h --max-depth=1 $1 | sort -h -r // To wypisze rozmiar katalogów w katalogu który wybrałeś
fi

zdaje się chodzi ci o coś takiego (mniej wiecej). Może ci się przydać man du man sort w poszukiwaniu innych opcji które są ci potrzebne.

0

Rewelacja! Dziękuję Ci strasznie, dodałem po poleceniu 'du' parametr -k, żeby wszystkie wartości przeliczyło na kilobajty i jest wszystko tak jak miało być. Bardzo dziękuję za pomoc! :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1