[BASH] Skrypt, który zmieni nazwy plików i katalogów

Witam,

Potrzebuje wykonać skrypt powłoki bash, który będzie wykonywał poniższą instrukcję:

Napisać skrypt, który zmieni nazwy plików i katalogów, z katalogu podanego przez użytkownika.

a) Jeżeli nazwa jest małymi literami to na taką samą dużymi literami.

b) Jeżeli pierwszy znak nazwy to duża litera to zamieni ją na cyfrę.

Wzór:

Dokumenty 1okumenty

zadanie ZADANIE

ASD 123

Skrypt, który stworzyłem nie działa poprawnie. Jeżeli folder, który podaje jest z małych liter to zmienia je poprawnie na duże Identycznie jeżeli wszystkie litery są duże (zamienia poprawnie na cyfry). Jeżeli nazwa jest z dużej litery (pierwszy znak), zmienia nazwę folderu głównego poprawnie, ale zwraca też przy tym błąd “mv: cannot stat ‘Nazwa’ : no such file or directory”.

W żadnym przypadku nie zmienia jednak nazw zawartych w środku katalogów i plików.

Z góry dzięki, za pomoc w poprawieniu.

EDIT:

Poprawiłem lekko kod. Zmienia poprawnie nazwę folderu głównego. Niestety nie zmienia nazw w jego wnętrzu. Problem pewnie tkwi w pętlach, ale nie daje ich rady poprawić. Liczę na Waszą pomoc, w skryptach bash jestem początkujący.

#!/bin/bash


#Wczytanie nazwy folderu głównego

read of


#Zmiana jego nazwy wg instrukcji

if [-d $of]

then

	while true; do	

	na=`echo -n "$of" | tr A-Z 1-9`;

        nf=`echo -n "$of" | tr a-z A-Z`;


        if ["$na" != "$of"];

        then

           mv -- "$of" "$na"

	   nowy="$na"

	   break

        fi


	if ["$nf" != "$of"];

        then

           mv -- "$of" "$nf"

	   nowy="$nf"

	break

        fi


	done


	echo Zmieniona nazwa katalogu głównego $nowy


else

    echo 'blad'

fi


#Instrukcje do zmiany nazw całej zawartości naszego folderu głównego.

DIR=/home/andrzej/$nowy

for i in $DIR/*

do

   for of in $i

    do

        while true; do	

	na=`echo -n "$of" | tr A-Z 1-9`;

        nf=`echo -n "$of" | tr a-z A-Z`;


        if ["$na" != "$of"];

        then

           mv -- "$of" "$na"	   

	   break

        fi


	if ["$nf" != "$of"];

        then

           mv -- "$of" "$nf"	   

	break

        fi

	done

    done

done

Polecenie mv, z tego co mi wiadomo, nie posiada opcji rekursywnej zmiany nazw. Skrypt, który działa poprawnie.

#!/bin/bash

Dzięki wielkie za pomoc. Pozostaje jeszcze tylko jedna kwestia, która nie działa według instrukcji w treści zadania. Skrypt zmienia tylko nazwę “folderu głównego”, a nie zmienia nazw jego zawartości. Byłbym wdzięczny, gdybyś jeszcze podopowiedział jak to zmienić.

Spróbuj pokombinować z poleceniem find.

Próbuje, ale nie bardzo mi to wychodzi. Nie wyszukuje mi żadnych wartości, nic nie zmienia.

To co napisałem dużymi literami, to są osobne skrypty, w których dokonać musisz zmiany. W każdym skrypcie nazwa pliku to będzie $1.

find /JAKIS_KATALOG/ -type d -regex '.*\/[A-Z].*\/.*' -exec ZMIENIAM_NA_CYFRE.sh "{}" \;

find /JAKIS_KATALOG/ -type d -regex '.*\/[a-z0-9]*\/.*' -exec ZMIENIAM_NA_DUZE.sh "{}" \;

W ZMIENIAM_NA_CYFRE.sh możesz spokojnie zmienić przy pomocy polecenia tr

echo BAbc | sed 's/^A/0/' | sed 's/^B/1/' | ....

… i tak do każdego znaku. Metoda chałupnicza trochę, ale nie znam aż tak dobrze sed-a.

W ZMIENIAM_NA_DUZE.sh możesz spokojnie zmienić przy pomocy polecenia tr

Uparcie próbóje przerobić skrypt, który dostałem powyżej. Zrobiłem coś z funkcją find, niby działa, ale zmienia mi wszystko w folderze /home zamiast w podanym przeze mnie. Poprawcie proszę

#!/bin/bash


read of

DIR=/home/andrzej/$of/*


if [-d $of]; then

for of in find / -path '$DIR' -name *.*

do

   		a=$(echo $of | tr A-Z 1-9)

                b=$(echo $of | tr a-z A-Z)

                        if [$of = $a]; then

                                mv -v $of $b

                        else

                                mv -v $of $a

                        fi

        done

else

        echo "BŁĄD!"

fi

Pisane tak na szybko, więc musisz sobie dostosować, bo może nie działać w 100%, przynajmniej nie zdążyłem dobrze tego przetestować, bo z czasem krucho. No ale w końcu chcesz tylko podpowiedzi, a nie gotowca. :wink:

#!/bin/bash

Wysypuje się w momencie kiedy mamy podkatalogi, albo pliki w podkatalogach. W czym problem? Kombinowałem z poleceniem -maxdepth ale bez skutku.