Rizzla Skrevet 22. april 2009 Del Skrevet 22. april 2009 Hei folkens! Jeg er linux noob, og prøver å lage et skript som skal fjerne æøå og mellomrom fra (kun)filer (ikke dir) Jeg har nesten fått det til men har problemer med mellomrom. Slik ser scriptet mitt ut i dag: #!/bin/bash clear if [ ! $# = 1 ] then echo " " echo "** Error** Du må angi sti **Error** " echo "eksempel: oblig1.sh /home/ray/" echo " " exit else echo "Dette scriptet kommer til å forandre filnavn på filer i katalogen $1 med æøå og mellomrom!! hvorav ø blir oe, æ blir ae, å blir aa og mellomrom blir _" echo " " echo "Trykk y for å forsette, alt annet vil avslutte uten forrandringer" read svar if [ $svar = y ] then clear teller=0 teller2=0 for fil in $(ls $1 -p | grep -v /) do nyfil=$fil nyfil=${nyfil// /_} nyfil=${nyfil//æ/ae} nyfil=${nyfil//Æ/AE} nyfil=${nyfil//ø/oe} nyfil=${nyfil//Ø/OE} nyfil=${nyfil//å/aa} nyfil=${nyfil//Å/AA} if [ ! $fil = $nyfil ] then mv $1$fil $1$nyfil ffil[$teller2]=$fil fnfil[$teller2]=$nyfil teller2=$((teller2+1)) fi done if [ $teller2 -gt 0 ] then echo "*******************************" echo "$teller2 fil(er) forandret navn" echo "*******************************" echo "*******************************" while [ $teller -le $teller2 ] do echo "${ffil[$teller]} heter nå: ${fnfil[$teller]}" teller=$(($teller+1)) done fi else exit fi fi Problemet ligger i for fil in $(ls $1 -p | grep -v /) men jeg greier ikke å finne ut hvordan jeg skal gjøre det for å få det til å funke som det skal... har en test fil som heter æ ø å.txt men for løkken deler den opp, huffda... Takker på forhånd for all hjelp og nyttig informasjon Lenke til kommentar
Sokkalf™ Skrevet 22. april 2009 Del Skrevet 22. april 2009 Sett "" rundt variabler som kan inneholde mellomrom. F.eks $1 blir til "$1". Det kan nok hjelpe litt på vei.. ellers tror jeg det scriptet kan gjøres betydelig enklere. Lenke til kommentar
Maelwedd Skrevet 22. april 2009 Del Skrevet 22. april 2009 Nå har jeg ikke lest gjennom skriptet ditt, men hvis $1 er mappen du skal kikke i, så vil det hjelpe å bruke "ls -pQ $1". "-Q" gjør at den lister opp alle filer/mapper med """ rundt, som igjen gjør at for-løkka ikke ser mellomrommene i filnavn som skille mellom elementer. Ehh, sagt på en kompleks måte Lenke til kommentar
indietrash Skrevet 22. april 2009 Del Skrevet 22. april 2009 (endret) eh, ville gjort dette slik jeg: #!/bin/bash IFS=$'\n' name=$1 newname=$name echo $newname | egrep " " > /dev/null if [ "$?" = "0" ] then newname=`echo $newname | sed "s/ //g"` fi echo $newname | egrep "æ" > /dev/null if [ "$?" = "0" ] then newname=`echo $newname | sed "s/ /ae/g"` fi echo $newname | egrep "ø" > /dev/null if [ "$?" = "0" ] then newname=`echo $newname | sed "s/ /oe/g"` fi echo $newname | egrep "å" > /dev/null if [ "$?" = "0" ] then newname=`echo $newname | sed "s/ /aa/g"` fi echo $newname | egrep "Æ" > /dev/null if [ "$?" = "0" ] then newname=`echo $newname | sed "s/ /AE/g"` fi echo $newname | egrep "Ø" > /dev/null if [ "$?" = "0" ] then newname=`echo $newname | sed "s/ /OE/g"` fi echo $newname | egrep "Å" > /dev/null if [ "$?" = "0" ] then newname=`echo $newname | sed "s/ /AA/g"` fi if [ "$name" != "$newname" ] then echo "renaming " $name $newname mv "$name" "$newname" fi nå har ikke jeg noen særlige skills, men det der var kjapt og lett å skrive. Endret 22. april 2009 av indietrash Lenke til kommentar
Rizzla Skrevet 22. april 2009 Forfatter Del Skrevet 22. april 2009 Sett "" rundt variabler som kan inneholde mellomrom. F.eks $1 blir til "$1". Det kan nok hjelpe litt på vei.. ellers tror jeg det scriptet kan gjøres betydelig enklere. Vet det med "" problemet er å få til dette i ls funksjonen.. Jepp er helt sikkert enklere måter å gjøre dette på, men som sagt- jeg er noob! Nå har jeg ikke lest gjennom skriptet ditt, men hvis $1 er mappen du skal kikke i, så vil det hjelpe å bruke "ls -pQ $1". "-Q" gjør at den lister opp alle filer/mapper med """ rundt, som igjen gjør at for-løkka ikke ser mellomrommene i filnavn som skille mellom elementer. Ehh, sagt på en kompleks måte hmmm, høres ut som akkurat det jeg trenger, må komme meg i rette miljø for å teste, takk. eh, ville gjort dette slik jeg: takker Lenke til kommentar
Maelwedd Skrevet 22. april 2009 Del Skrevet 22. april 2009 Rart, jeg testa "-Q" selv nå, men det hjalp ikke. Er ganske sikker på at det er sånn jeg har gjort det selv tidligere. Du kan uansett gjøre det ganske enkelt hvis du midlertidig omdefinerer litt på for-funksjonen: ORGIFS=$IFS IFS=`echo -en "\n\b"` for i in $(ls -1 $1); do #saker og ting her done IFS=$ORGIFS "IFS" angir tegnet som for-løkka bruker for å skille mellom elementer, i linje to settes den til linjeskift (ORGIFS er for å sette den tilbake på slutten). "-1" til "ls" gjør at den lister opp med ett element per linje. Lenke til kommentar
Kagee Skrevet 22. april 2009 Del Skrevet 22. april 2009 Hvorfor må du fjerne æøå<space> fra filnavnene i første omgang? Lenke til kommentar
Rizzla Skrevet 22. april 2009 Forfatter Del Skrevet 22. april 2009 Rart, jeg testa "-Q" selv nå, men det hjalp ikke. Er ganske sikker på at det er sånn jeg har gjort det selv tidligere.Du kan uansett gjøre det ganske enkelt hvis du midlertidig omdefinerer litt på for-funksjonen: ORGIFS=$IFS IFS=`echo -en "\n\b"` for i in $(ls -1 $1); do #saker og ting her done IFS=$ORGIFS "IFS" angir tegnet som for-løkka bruker for å skille mellom elementer, i linje to settes den til linjeskift (ORGIFS er for å sette den tilbake på slutten). "-1" til "ls" gjør at den lister opp med ett element per linje. Yess!! Supert funkert kongebra! helt perfekt! takk takk Hvorfor må du fjerne æøå<space> fra filnavnene i første omgang? Skoleoppgave, dessuten er det ingen dum ting å kunne.. Lenke til kommentar
jonnor Skrevet 23. april 2009 Del Skrevet 23. april 2009 (endret) Ingen dum ting å kunne sed/regexp heller: [jon@jon-desktop forum]$ ls -pQ; ls -pQ | sed 's/[åæø\ ]\+//'; "e" "t e" "tåa" "tåe" "vanligfil" "ååø.txt" "æåøsd.txt" "e" "te" "ta" "te" "vanligfil" ".txt" "sd.txt" EDIT: xfce4 terminal er bøg... Endret 23. april 2009 av NorthWave Lenke til kommentar
Rizzla Skrevet 23. april 2009 Forfatter Del Skrevet 23. april 2009 Ingen dum ting å kunne sed/regexp heller: [jon@jon-desktop forum]$ ls -pQ; ls -pQ | sed 's/[åæø\ ]\+//'; "e" "t e" "tåa" "tåe" "vanligfil" "ååø.txt" "æåøsd.txt" "e" "te" "ta" "te" "vanligfil" ".txt" "sd.txt" EDIT: xfce4 terminal er bøg... Jepp, har vært litt innomg sed.. visste ikke at man kunne bruke regexpressions i sed da Går nesten helt rundt av regex... fatter ikke helt den der da Lenke til kommentar
jonnor Skrevet 23. april 2009 Del Skrevet 23. april 2009 Det inni [] er en karaktergruppe som det blir matchet på. Denne inkluderer selvfølgelig åæø og mellomrom (\ ), fordi det er det du ønsker å fjerne. Og \+ er fordi du ønsker å fjerne en eller flere slike karakterer (det kan jo være flere etterhverandre). s/ er substitute kommandoen til sed, og erstatter det etter den første / med det etter den andre / (i dette tilfelle ingenting fordi vi bare ønsker å fjerne). Regexp er kanskje den nyttigste tingen du kan lære deg. Det tar litt tid å forstå det grunnleggende, men etter det er det ganske lett. Lenke til kommentar
comicz Skrevet 23. april 2009 Del Skrevet 23. april 2009 ...og er det meste man gjør med sed blir mulig/greiere med regex :-) Et annet lite tips mens vi er i gang her mtp IFS: Det er ikke nødvendig å ta vare på IFS (ORIGIFS) for å sette den tilbake slik den var; unset IFS vil føre til at original-IFS blir gjenopprettet. Lenke til kommentar
Rizzla Skrevet 23. april 2009 Forfatter Del Skrevet 23. april 2009 Flotte greier, mange gode innspill her gitt. fint at det er folk som styrer med dette og som setter av litt tid for å hjelpe andre i gang. Takk alle! Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå