#!/bin/bash # # skrypt wczytuje nazwe katalogu i tworzy linki symboliczne # do wszystkich plikow i katalogow w nim zawartych, w katalogu # podanym jako drugi argument, podanie opcji -f przed argumentami # spowoduje nadpisanie istniejacych plikow w docelowym katalogu. # W celach diagnostycznych skrypt wypisuje na standardowe wyjscie, # jakie dowiazanie symboliczne linkuje dany plik lub katalog. # Nazwy katalogow _musza_ byc bezwzgledne (zadzala rowniez ~/ # na poczatku nazwy), znak / na koncu nazwy, nie zmieni dzialania # skryptu, jednak na wyjsciu standardowym beda pojawialy sie, # w nazwach, zbedne dodatkowe slash'e # # ciekawostka: konieczne bylo uzycie polecenia rm, zamiast # flagi -f polecenia ln, ze wzgledu na "dziwne" # zachowanie ln przy nadpisywaniu istniejacych plikow # # Na tempacu nalezy zmienic pierwsza linie na: #!/usr/local/bin/bash # skrypt dziala prawidlowo w bash (na linuksach zazwyczaj sh jest # rowniez bashem) # niestety nie bedzie dzialal w ksh, csh, tcsh oraz w sh SanOS'a # # (c) Kacper Kulczycki 2006 # LKAT=1; # numer linku do katalogu LPL=1; # numer linku do pliku FO=0; # pomocnicza zmienna do opcji "force" # funkcja wywolujaca sie rekurencyjnie i sprawdzajaca: # czy to plik czy katalog, oraz linkujaca go w docelowym katalogu function REKURENCJA() { KATAL=`pwd`;# dzala tez z =$PWD; cd $2; for NAZWA in "$1/"* # jedziemy po zawartosci katalogu do if test -d "$NAZWA" # czy to katalog then if test -h "katalog$LKAT" || test -e "katalog$LKAT" # czy link/katalog/pilk w docelowym katalogu istnieje then if test "$FO" = "-f" # czy flaga "force" then rm "$FO"r "katalog$LKAT"; echo "silowo: $NAZWA to katalog, ln po raz $LKAT w katalogu $2"; ln -s "$NAZWA" "katalog$LKAT"; else echo "link $2/katalog$LKAT istnieje skasuj przed wywolaniem skryptu"; fi else echo "nie silowo: $NAZWA to katalog, ln po raz $LKAT w katalogu $2"; ln -s "$NAZWA" "katalog$LKAT"; fi LKAT=`expr $LKAT + 1`; # zwiakszamy licznik katalogow REKURENCJA "$NAZWA" "$2"; # rekurencyjne wywolanie w celu zlinkowania zawartosci tego katalogu elif test -f "$NAZWA" # czy to zwykly plik then if test -h "plik$LPL" || test -e "plik$LPL" # czy link/plik w docelowym katalogu istnieje then if test "$FO" = "-f" # czy flaga "force" then rm "$FO"r "plik$LPL"; echo "silowo: $NAZWA to plik, ln po raz $LPL w katalogu $2"; ln -s "$NAZWA" "plik$LPL"; else echo "link $2/plik$LPL istnieje skasuj przed wywoloaniem skryptu" fi else echo "nie silowo: $NAZWA to plik, ln po raz $LPL w katalogu $2"; ln -s "$NAZWA" "plik$LPL"; fi LPL=`expr $LPL + 1`; # zwiekszamy licznik plikow fi done cd $KATAL; # powrot do katalogu z ktorego zaczelismy } if test $# -lt 2 # czy odpowiednia liczba parametrow then echo "Procedura wymaga podania katalogu linkowanego i katalogu docelowego,"; echo "wywolanie z opcja -f jako pierwszym parametrem (dwa pozostale jak wyzej),"; echo "powoduje nadpisanie istniejacych linkow. Niestety, ze wzgledu na specyfike"; echo "funkcji ln obie nazwy katalogow musza byc bezwzgledne"; echo "(nazwa rozpoczeta od ~/ rowniez zadziala). Umieszczenie / na koncu nazw,"; echo "nie wplywa na dzalanie skryptu, jednak dane na standardowym wyjsciu, beda"; echo "zawieraly ten jeden, zbedny, dodatkowy znak" else if test "$1" = "-f" # czy flaga "force" then FO=$1; shift; if test -d $2 # czy docelowy katalog istnieje then REKURENCJA "$1" "$2"; else echo "tworze katalog $2"; mkdir "$2"; REKURENCJA "$1" "$2"; fi elif test -d $2 # czy docelowy katalog istnieje then REKURENCJA "$1" "$2"; else echo "tworze katalog $2"; mkdir "$2"; REKURENCJA "$1" "$2"; fi fi