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"
fiP.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




Użyszkodnik
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