Jako że pisanie skryptów w bashu to nie jest to w czym jestem dobry, proszę bardziej doświadczonych o pomoc.
Sytuacja wygląda tak: mam folder a w nim podfoldery. W tych podfolderach mogą być kolejne podfoldery itd. W każdym z tych folderów mogą znajdować się pliki których struktura wygląda tak:
zmienna1.stała.zmienna2
gdzie zmienna 1 i zmienna2 mogą zawierać dowolny ciąg znaków a stała zawsze jest taka sama.
Po wykonaniu skryptu nazwa pliku ma się zmienić na
zmienna1.stała0.stała.zmienna2
Wiem tylko tyle, że przeszukanie i sprawdzenie w którym katalogu/podkatalogu są pliki odpowiadające wzorcowi znajdę find’em, ale jak wykorzystać to do automatycznej zmiany nazw znalezionych plików?
Skrypt do testów (w celu stworzenia przykładowej struktury katalogów i plików):
kaka@debian:/tmp$ cat new_make.sh
#!/bin/bash
DIR=/tmp/areh2
const="aaaa"
for i in `seq 1 10`
do
mkdir -p $DIR/folder$i
done
for i in $DIR/*
do
for x in `seq 1 10`
do
touch $i/$RANDOM.$const.$RANDOM
done
done
kaka@debian:/tmp$
Docelowy skrypt:
kaka@debian:/tmp$ cat new_skr.sh
#!/bin/bash
DIR=/tmp/areh2
const="aaaa"
const_2="bbbb"
for i in $DIR/*
do
for x in $i/*$const*
do
b=`basename $x`
read zm_1 zm_2 <<< ${b//$const/ }
mv "$x" `dirname $x`/"$zm_1""$const_2"."$const""$zm_2"
done
done
kaka@debian:/tmp$
Tworzenie nowych plików i katalogów (testowych) oraz wyświetlenie całej struktury:
Jedyne co mi się w tym skrypcie nie podoba, to read. Na bank można to zrobić odnosząc się jako do tablicy, ale za cholerę nie mogę sobie przypomnieć jak to zapisać (a nie chce mi się szukać).
Mać… Nie doczytałem do końca Twojego problemu. Może być wiele subkatalogów. Powyższe odnosi się tylko do jednego subkatalogu. Tutaj masz poprawioną wersję:
kaka@debian:/tmp$ cat new_make.sh
#!/bin/bash
DIR=/tmp/areh2
const="aaaa"
for i in `seq 1 10`
do
mkdir -p $DIR/folder$i
for x in `seq 1 10`
do
mkdir -p $DIR/folder$i/folder$x
touch $DIR/folder$i/$RANDOM.$const.$RANDOM
for z in `seq 1 10`
do
touch $DIR/folder$i/folder$x/$RANDOM.$const.$RANDOM
done
done
done
kaka@debian:/tmp$
kaka@debian:/tmp$ cat ./new_skr.sh
#!/bin/bash
DIR=/tmp/areh2
const="aaaa"
const_2="bbbb"
for i in `find $DIR -name "*$const*"`
do
b=`basename $i`
read zm_1 zm_2 <<< ${b//$const/ }
mv $i `dirname $i`/"$zm_1""$const_2"."$const""$zm_2"
done
kaka@debian:/tmp$
W przypadku wielu podkatalogów, również można użyć for’a rekurencyjnie, ale chyba prościej (i czytelniej) to zapisać find’em. Nowa wersja jest z find’em. Spróbuj sobie zrobić to for’em, tak dla ćwiczenia :). Nie wstawiam tutaj już listingu z przed i po wykonaniu skryptu, bo za wiele by zajmował. Możesz sobie zrzucić wyniki do pliku i zrobić diff’a, np.:
./new_make.sh
tree /tmp/areh2 > file_make
./new_skr.sh
tree /tmp/areh2 > file_skr
meld file_make file_skr
PS: nie bijcie za kod, jest już późno, w pracy dostatecznie dużo kodziłem, a teraz jeszcze tutaj mi się zachciało :P.
Chyba jednak mało konkretnie opisałem problem w pierwszym poście. Te zmienne o których pisałem to są już konkretne ciągi znaków, które po zmianie muszą zostać takie same (coś podobnego do tego w czym mi ostatnio pomagałeś). Te stałe z kolei, to stały ciąg znaków, który we wszystkich plikach jest identyczny.
Spróbuję coś sam pokodzić na podstawie tego co zrobiłeś, ale nie wiem jaki będzie tego skutek :D.
Stałe są zachowane - zrób sobie diffa tak jak pokazałem (meld jest fajny i prosty). Ja po prostu wygenerowałem przykładowe nazwy za pomocą $RANDOM (no sorry, ale nie będę z palca wymyślać chociażby 100 nazw :P). Spójrz w diff - wszystko będzie jasne.
Co do stałej, którą podałeś… Skoro zawsze jest taka sama, to przecież możesz ją wbić na sztywno w skrypt (tak jak ja to zrobiłem - $const). Tak samo druga stała. Na upartego, bardziej uniwersalnie, możesz wyciągnąć stałą z jakiegokolwiek pliku (z jego nazwy), przykładowo tak jak zrobiłem read. Ale jaki jest tego sens? Skoro wyciągasz z nazwy, logiczne jest, że nie jesteś pewien wartości tej stałej - tym samym, nie możesz tej wartości nazwać stałą :).
Sorki, po pracy jestem, zmęczenie daje znać o sobie. Popatrzyłem najpierw na jeden skrypt, później na drugi, nie wiem dlaczego wydawało mi się że to jeden i ten sam
EDIT
Zacząłem to robić trochę innych sposobem. Żeby zachować te “zmienne” zrobiłem to tak:
Właściwie to nie do końca zrobiłem, bo nie mogę rozgryźć tego co powinienem wstawić w miejsce [zmienna2]. Czytałem man cut, ale nie bardzo mi to wychodzi. Nie napisałem tego chyba w pierwszym poście: zmienna1 i zmienna2 przed zmianą i po zmianie nazwy pliku nie mogą się zmienić.