Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Witam! Program zagląda rekurencyjnie do podkatalogów podanego jako parametr katalogu i zwraca jako wielkość katalogu łączną sumę zajętości plików. Dla zwykłego pliku drukuje jego zajętość. Problem pojawia się przy sortowaniu, bo przestało działać. Jeżeli w funkcji podkat odkomentuję wywołanie funkcji sortuj, to nie wypisze się lista zajętościowa dla wszystkich podkatalogów. Jeżeli nigdzie nie wywołuję funkcji sortuj, to wszystko działa, tylko, że wypisuje nieposortowane. Ktoś pomoże?
#!/bin/bash if [ -d $1 ] then awk -vARG1=$1 'BEGIN{ i = 0 while (("ls -o "ARG1"" | getline) > 0){ if (NF > 2){ i++ tab[i,2] = $3 if(substr($1,1,1) == "-"){ tab[i,1] = $4 tab[i,3] = "-" tab[i,4] = $NF } else if(substr($1,1,1) == "d") {tab[i,3] ="d" ; tab[i,4] = $NF; tab[i,1] = zlicz(ARG1 "/" $NF)} else if(substr($1,1,1) == "l"){ tab[i,1] = $4 tab[i,3] = "l" tab[i,4] = $NF} }} close ("ls -o"); #sortuj(tab, i); wypisz(i, ARG1, tab) podkat(tab, ARG1, i) } #zakonczenie begina function wypisz(ile_l, nazwa, tab1){ print("\nLista zajetosciowa dla folderu: ", nazwa ); printf("%-15s", "zajetosc w B") ; printf("%-12s", "uzytkownik") ; printf("%-7s", "rodzaj") ; printf("%-20s\n", "nazwa pliku"); for(k = 1; k<=ile_l; k++){ printf("%-15s", tab1[k,1]) ; printf("%-12s", tab1[k,2]) ; printf("%-7s", tab1[k,3]) ; printf("%-20s\n", tab1[k,4])}} function zlicz(kat, suma){ #close("ls -o") while(("ls -o "kat"" | getline) > 0){ if (substr($1,1,1) == "d"){ suma+=zlicz(kat "/" $NF) } else {suma+= $4} } close("ls -o"); return suma } function sortuj(tab, max, temp){ for(k=1; k<=max; k++){ for(i = 1; i<max; i++){ if(tab[i,1] < tab[j,1]){ for(j=1; j<5 ;j++){ temp = tab[i,j]; tab[i,j]= tab[i+1,j]; tab[i+1,j] = temp}#koniec fora najbardziej zagniezdzonego }#koniec ifa }}#koniec pierwszego i drugiego fora } function podkat(tab, nazwa, dlugosc, tab2){ for(i = 1; i<=dlugosc; i++){ if(tab[i,3] == "d"){ j=0 while (("ls -o "nazwa tab[i,4]"" | getline) > 0){ if(NF > 3){ j++ tab2[j,2] = $3 if(substr($1,1,1) == "-"){ tab2[j,1] = $4 tab2[j,3] = "-" tab2[j,4] = $NF }else if(substr($1,1,1) == "d") {tab2[j,3] ="d" ; tab2[j,4] = $NF; tab2[j,1] = zlicz(nazwa tab[i,4] "/" $NF)} else if(substr($1,1,1) == "l"){ tab2[j,1] = $4 tab2[j,3] = "l" tab2[j,4] = $NF} }#zamyka ifa }#zamyka whilea close ("ls -o"); #sortuj(tab2, j); wypisz(j, nazwa tab[i,4], tab2) }#zamykajacy ifa }#zamykajacy fora }#zamykajacy funkcje ' #zakonczenie awk else echo "Podano ścieżke do katalogu, który nie istnieje" fi
P.S. Sorry za styl, ale dzisiaj zacząłem pisać w tym języku i mam spore problemy ze składnią...
Ostatnio edytowany przez Khamell (2010-05-07 18:31:16)
Offline
O ile to nie jest program na zaliczenie, który musi być napisany w awk:
du --si -cs katalog/
Offline
Niestety to jest program na zaliczenie. Znalazlem coś takiego;
{for (wino in obrot) {print wino, obrot[wino] | "sort -nr +1" }}
tylko nie wiem jak teraz tego użyć do tablicy dwuwymiarowej, żeby mi sortował według pierwszego pola, czyli tab[k,1], gdzie znajduje sie liczba.
Edycja:
Udało mi się użyć funkcji sort, do sortowania tabeli dwuwymiarowej podczas wypisywania:
for(k = 1; k<=ile_l; k++){printf "%-15s %-12s %-7s %-20s\n", tab1[k,1] , tab1[k,2] , tab1[k,3] , tab1[k,4] | "sort -nr -k 1,1"} return}
Tylko, że skrypt wykrzacza się jak jest wywoływana funkcja podkat....czy ktoś powie mi, gdzie robię błąd? Błagam...
Edycja2: Temat do zamknięcia, skrypt napisany
Ostatnio edytowany przez Khamell (2010-05-09 11:53:35)
Offline
Time (s) | Query |
---|---|
0.00013 | SET CHARSET latin2 |
0.00006 | SET NAMES latin2 |
0.00099 | SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='3.136.22.204' WHERE u.id=1 |
0.00084 | REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '3.136.22.204', 1732338913) |
0.00042 | SELECT * FROM punbb_online WHERE logged<1732338613 |
0.00050 | SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=16785 AND t.moved_to IS NULL |
0.00006 | SELECT search_for, replace_with FROM punbb_censoring |
0.00169 | SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=16785 ORDER BY p.id LIMIT 0,25 |
0.00078 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=16785 |
Total query time: 0.00547 s |