Nowe posty

Autor Wątek: Tworzenie lustrzanego drzewa katalogów  (Przeczytany 9912 razy)

solange90

  • Gość
Tworzenie lustrzanego drzewa katalogów
« dnia: 2013-05-09, 00:00:17 »
Witam, potrzebuję zrobić skrypt tworzący lustrzane drzewo katalogów ( katalog --> katalog.md5 ). Próbowałam na wiele sposobów, ale już nie mam więcej pomysłów, bo jak na razie nic nie wyszło.

Zrobiłam sobie funkcję a'la find rekurencyjną, która wypisuje wszystkie elementy poddrzewa i próbowałam coś na tym.

rfind()
{
    cd "$1"

    for f in *; do

    if [ -d "$f" ]; then
        echo "$f"

        rfind "$f"
    else
echo "$f"
   fi
    done

    cd ../
}
Jakby ktoś miał pomysł jak to zrealizować, byłabym super wdzięczna!

darkdancer

  • Gość
Tworzenie lustrzanego drzewa katalogów
« Odpowiedź #1 dnia: 2013-05-12, 23:27:44 »
Jeśli dobrze zrozumiałem zadanie to chcesz kopię drzewa katalogów bez plików znajdujących się wewnątrz nich? Moje rozwiązanie nie jest zbyt eleganckie, bo może jest jakiś genialny switch do finda, który eliminowałby potrzebę użycia seda ale działa:
find katalog -type d | sed 's/katalog/&\\.md5/' | xargs mkdir -p
Oczywiście jeśli chcesz kopię w innym miejscu to trzeba odpowiednio manipulować ścieżkami.

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
Tworzenie lustrzanego drzewa katalogów
« Odpowiedź #2 dnia: 2013-05-13, 11:10:33 »
Jest taki "switch" i nazywa się -printf:
dir='katalog'
find "$dir" -type d -printf "${dir}.md5/%P\\n" | xargs mkdir -p
Pozdrawiam.

solange90

  • Gość
Tworzenie lustrzanego drzewa katalogów
« Odpowiedź #3 dnia: 2013-05-13, 23:31:07 »
Dzięki za odzew!
Ogólnie źle się wyraziłam, bo pliki również miały być utworzone w lustrzanym katalogu, ale to nie problem, już to zmieniłam :)

Zastanawia mnie tylko dlaczego katalogi wewnętrzne nie dostały rozszerzenia .md5, tylko korzeń drzewa i jak zmienić, żeby wszystkie katalogi w nowym drzewie były oznaczone skrótem .md5?

darkdancer

  • Gość
Tworzenie lustrzanego drzewa katalogów
« Odpowiedź #4 dnia: 2013-05-14, 11:38:09 »
Cytat: solange90
Zastanawia mnie tylko dlaczego katalogi wewnętrzne nie dostały rozszerzenia .md5, tylko korzeń drzewa i jak zmienić, żeby wszystkie katalogi w nowym drzewie były oznaczone skrótem .md5?
Bo źle zrozumieliśmy co chcesz tak naprawdę zrobić. W takim przypadku po prostu wykonaj kopię całego katalogu a następnie za pomocą find dla każdego znalezionego elementu w kopii, który jest katalogiem zmień nazwę na tą z wybranym przez Ciebie rozszerzeniem. Wszystkie niezbędne informacje masz już w tym wątku plus manualu do find (hint: switch -exec)

solange90

  • Gość
Tworzenie lustrzanego drzewa katalogów
« Odpowiedź #5 dnia: 2013-05-14, 22:01:20 »
Dzięki za wskazówki, Postarałam się zrobić tak jak mówiłeś:
 
cp -r $dir "$dir.md5"

find "$dir.md5"  -mindepth 1 -type d  -exec mv {} {}.md5 ";"
Ale nie zmienia mi  nazwy katalogu jeśli jest on głębiej np katalog.md5 / kat / kat1
Dla kat zmieni na kat.md5, ale jak przychodzi do kat1 to woła, że nie ma katalogu: katalog.md5 / kat / kat1
I słusznie, bo przecież jest już katalog.md5 / kat.md5 / kat1
Niestety linux to nie moja bajka...

darkdancer

  • Gość
Tworzenie lustrzanego drzewa katalogów
« Odpowiedź #6 dnia: 2013-05-15, 16:10:46 »
Cytat: solange90
find "$dir.md5"  -mindepth 1 -type d  -exec mv {} {}.md5 ";"
Ale nie zmienia mi  nazwy katalogu jeśli jest on głębiej np katalog.md5 / kat / kat1
Dla kat zmieni na kat.md5, ale jak przychodzi do kat1 to woła, że nie ma katalogu: katalog.md5 / kat / kat1
Prawie dobrze, zabrakło tylko -depth:
Cytat: man find
-depth Process each directory's contents before the directory  itself.   The  -delete  action  also  implies -depth.
find "$dir.md5"  -mindepth 1 -depth -type d  -exec mv {} {}.md5 \\;

solange90

  • Gość
Tworzenie lustrzanego drzewa katalogów
« Odpowiedź #7 dnia: 2013-05-16, 11:00:44 »
Dziękuje bardzo za poprawki i poświęcony czas :)