shell skripta ne radi

Poslao gigolo on 07.09.2008 20:25:42
#!/bin/bash
cd test
valid="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-_."
i=0
r=""
find . | while read f
do
d=length f
while i -lt d do
c=substr(f,i,1)
k=valid_find_char(c)
if (k=="-1") {c="_"}
r=r+c
i=i+1
done
mv f r
done


Pokušavan ovo pokreniti cilo popodne i ne ide. Jel kome od vas ide?

Re: shell skripta ne radi

Poslao gigolo on 07.09.2008 22:08:44
Jedna falinka. Triba ispod drugog do opet staviti r=""

Re: shell skripta ne radi

Poslao gigolo on 22.09.2008 23:05:16
#!/bin/bash
cd test
valid="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-_."
i=0
find . | while read f
do
r=""
d=$(echo ${#f})
while [i -lt $d] do
c=$(f:i:1)
k=`echo $valid | grep -i $c`
if [$k -eq ""]
then c="_"
fi
r=$r+$c
i=$i++
done
mv "$f" "$r"
done

Ne radi ni ovako dorađena. Na koji način mogu znati u čemu je problem?

Re: shell skripta ne radi

Poslao v-v on 23.09.2008 0:16:21
A da nam malo pojasniš sto to namjeravaš napisati? Imaš podosta krivih statementa, pomiješanih varijabli i sl.

Evo, slijedeće bis trebao moći pokrenuti

#!/bin/bash
valid="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-_."
i=0
find . | while read f; do
        r=""
        d=$(echo ${#f})
        while [ $i -lt $d ]; do
               c=$(echo ${f:i:1})
                if [ "$c" = "" ]; then
                        c="_"
                fi
                k=`echo $valid | grep -i $c`
                if [ "$k" = "" ]; then
                        c=""
                fi
                r=$r$c
                let i=i+1
        done
        echo "mv $f $r"
done


Nisam skužio sto bi trebalo raditi pa ni ne radi ništa , ali glavno da se pokreće

Re: shell skripta ne radi

Poslao gigolo on 23.09.2008 9:01:29
Hvala na ispravkama. Sam bih to teško napravio, jer se u shell programiranje ne razumijem, a skripta bi trebala rinejmati podfoldere i fajlove tako da zamjeni sve "messy characters" sa "_". Još jednom hvala i nadam se daljnoj pomoći.

Re: shell skripta ne radi

Poslao gigolo on 23.09.2008 10:44:52
#!/bin/bash
cd test
valid="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-_."
find . | while read f; do
j=1
        d=$(echo ${#f})
        while [ $j -lt $d ]; do
               c=$(echo ${f:j:1})
                k=`echo $valid | grep -i $c`
                if [ "$k" = "" ]; then
                        c="_"
                fi
                r=$r$c
                let j=j+1
      done
  r=$(echo ${r:1:d-2})
#if ["$f" -ne "$r"]; then
 mv "$f" "$r" 
#fi
r=""
done


Ovo radi kako želim. Još bih molio pomoć. Niz valid se vjerojatno može napisati jednostavnije koristeći [A-Z] i sl, ali mi ne uspjeva.
Kod mv sam pokušao dodati da se ne izvršava ali mi if ne radi, pa je u komentaru.
I još najblentavija izjava, ja ovu skriptu ne razumjem. Što je find . | while read f; do
To sam kopirao iz jedne skripte koju sam našao na netu. Ostalo sam guglao za sintaksu naredbi. Unaprijed hvala na pomoći!

Re: shell skripta ne radi

Poslao gigolo on 23.09.2008 11:19:20
Još jedna stvar. Guglao sam za valjanim znakovima za ime fajla/foldera u gnome, ali nisam ništa našao. Ima li još valjanih karaktera da dodam u niz valid?

Re: shell skripta ne radi

Poslao v-v on 23.09.2008 11:54:21
Citat:
Niz valid se vjerojatno može napisati jednostavnije koristeći [A-Z] i sl, ali mi ne uspjeva.


Evo ti onda umjesto bash skripte jedne veeelike komande

find . -type f | while read I; do N=$( echo -n $I | tr -cs 'a-zA-Z0-9./' '_' ); if [ "$I" != "$N" ]; then echo "$I -> $N"; mv "$I" "$N"; fi done;


Nebih znao koji su sve dozvoljeni znakovi :\

Re: shell skripta ne radi

Poslao gigolo on 23.09.2008 12:05:45
Stvarno je velika i ne razumijem je. Osim okvirno. Trebao bih znati detaljno šta radi pojedini dio koda.

Re: shell skripta ne radi

Poslao v-v on 23.09.2008 12:23:40
Ispričavam se, mala greškica (tr -cs je pisalo umjesto tr -c) je bila zbog čega je više nečitljivih znakova zamijenjivala sa jednim _ a ne više njih. Slijedeće je u redu:

find . -type f | while read I; do N=$( echo -n $I | tr -c 'a-zA-Z0-9./' '_' ); if [ "$I" != "$N" ]; then echo "$I -> $N"; mv "$I" "$N"; fi done;


No ajmo je onda sistematizirati:

#!/bin/bash
find . -type f | while read I; do 
	N=$( echo -n $I | tr -c 'a-zA-Z0-9./' '_' );
	if [ "$I" != "$N" ]; then
		echo "$I -> $N";
		mv "$I" "$N";
	fi
done;



i proći pojedine dijelove:


find . -type f | while read I; do
Traži fileove te loopa za svaki file. Filename je sadržan u I.

N=$( echo -n $I | tr -c 'a-zA-Z0-9./' '_' );
S echo puštamo početni filne name kroz tr -c koji zamjenjuje svaki znak koji ne matcha a-z A-Z 0-9 . ili / sa _. Echo ima -n parametar jer bi inače dodavao newline znak koji bi nam tr kasnije zamjenio sa _ pa bi nam svaki file imao dodatni _ na kraju, što ne želimo. Novi filename (sa izmijenjenim znakovima) spremamo u varijablu N.


if [ "$I" != "$N" ]; then
	echo "$I -> $N";
	mv "$I" "$N";
fi
Ukoliko početni i završni filename nisu isti (što znači da su imali neželjenih znakova unutra pa ih je gornji red zamjenio) ispišemo korisniku što i gdje renameamo te to učinimo.

Ova poruka je od: http://www.linux.hr/newbb/viewtopic.php?forum=8&topic_id=1889