Nowe posty

xx Problem ze sterownikami. (5)
2024-04-13, 21:25:16
xx Instalacja xfce4 (2)
2024-04-13, 16:20:17
xx Serie kompilacji bez instalacji dla “emerge” w Gentoo (2)
2024-04-08, 18:40:04
xx Plasma 6 w Neonie ssie trochę mniej ... (17)
2024-04-05, 10:03:46
xx Problem z Linux Lite po instalacji (3)
2024-04-03, 14:23:40
xx Jak właczyć num locka przy starcie systemu debian 12? (12)
2024-04-02, 17:43:54
xx Brak dźwieku w systemie. (5)
2024-04-02, 16:13:41
xx Dystrybucja pod HP Omen (7)
2024-03-29, 11:33:05
xx [Poradnik] Wyszukiwanie Sterowników (2)
2024-03-27, 21:08:23
xx Ile pingwinów? (1)
2024-03-27, 08:59:24

Autor Wątek: Funkcja rekurencyjna tworząca drzewo katalogów  (Przeczytany 5733 razy)

cadi2108

  • Gość
Funkcja rekurencyjna tworząca drzewo katalogów
« dnia: 2010-02-06, 20:22:09 »
Witam ponownie!

Już dwa dni próbuję napisać funkcję, którą gdy się wywoła w następujący sposób:

create_directory $directory 2 2
to otrzymamy drzewo katalogów w katalogu $directory o głębokości 2 i z 2 katalogami w każdym katalogu, czyli:

            $directory
                 |
         ================
         |               |
     ========        =========
     |      |        |       |
     |      |        |       |
natomiast gdy wywołam

create_directory $directory 3 2
to otrzymamy drzewo katalogów w katalogu $directory o głębokości 3 i z 2 katalogami w każdym katalogu, czyli:

            $directory
                 |
         ================
         |               |
     ========        =========
     |      |        |       |
   =====  =====     ====    ====
   |   |  |   |     |  |    |  |
   |   |  |   |     |  |    |  |
Poniżej znajduje się kod źródłowy mojej funkcji... niestety z rekurencji nigdy nie byłam mocna ;/

 
function create_directory() {
  if [ $depth -eq 0 ]; then
    return 1
  fi
 
  for i in `seq 1 $3`; do
    mkdir $1/$i
  done
  (( tmp=$2-1))
  create_directory $1/$i $tmp $3
}
Czy ktoś może widzi co w tej funkcji mam nie tak, że nie chodzi tak jak trzeba? Będę bardzo wdzięczna za wszelkie uwagi.

arctgx

  • Gość
Funkcja rekurencyjna tworząca drzewo katalogów
« Odpowiedź #1 dnia: 2010-02-06, 23:01:03 »
#!/bin/bash
create_directory() {
local depth=$2
local i
if [[ $depth -gt 0 ]]
then
echo depth=$depth kat=$1 liczba=$3
for ((i=1;i<=$3;i++))
do
mkdir -p $1/$i
echo $1/$i i=$i
create_directory "$1/$i" $((depth-1)) $3
done
echo depth_na_koncu=$depth
fi
echo koniec
}
rm -rf x
create_directory x 3 3
find x
Zerknij na wstępną wersję z linijkami debugującymi. Nie wiem czym różni się u Ciebie zmienna depth od tmp. Pierwsze co mi do głowy przyszło to zadeklarować depth jako zmienną lokalną w funkcji (żeby jej wewnętrzne wywołania nie nadpisywały). To jednak nie dało jeszcze tego co trzeba (zmienna i ruszała tylko raz). Spędziłem jakąś godzinkę czasu co jest nie tak. Do teraz nie rozpracowałem solidnie, dlaczego gdy zmienną sterującą w pętli zadeklarowałem jako lokalną, funkcja zaczęła dawać to co trzeba (przynajmniej na kilku przykładach). To więc tylko przypadek, w dodatku niepewny.

P.S. Może znajdę chwilę by przekonać się co zrobiłem ;)

arctgx

  • Gość
Funkcja rekurencyjna tworząca drzewo katalogów
« Odpowiedź #2 dnia: 2010-02-06, 23:38:48 »
Chyba zaczynam łapać, dlaczego zmienna i  nie ruszała w zewnętrznej pętli więcej niż raz. Wewnętrzna pętla (ta najgłębsza) ustawiała ją na $3, a że zmienna nie miała lokalnego charakteru, to i po wyjściu z pierwszej najgłębszej pętli była większa niż $3. Dlatego próba drugiej iteracji mówiła że już nie ma nic do roboty.

Można powiedzieć inaczej: różne istniejące naraz pętle używały tej samej zmiennej, co dawało zamieszanie. Stworzenie lokalnej kopii dało to, że wartość nie wpływa na wartości zmiennej o tej samej nazwie w innych wywołaniach, także w tych wyżej. To już wydaje mi się w miarę solidnym wyjaśnieniem.

create_directory() {
local depth=$2
local i
if [[ $depth -gt 0 ]]
then
for ((i=1;i<=$3;i++))
do
mkdir -p $1/$i
create_directory "$1/$i" $((depth-1)) $3
done
fi
}

cadi2108

  • Gość
Funkcja rekurencyjna tworząca drzewo katalogów
« Odpowiedź #3 dnia: 2010-02-07, 10:24:50 »
Działa wspaniale! Dziękuję bardzo za pomoc :)