Gå til innhold

[Løst]Script Hjelp - Fjerne æøå og mellomrom fra filer


Anbefalte innlegg

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 :new_woot:

Lenke til kommentar
Videoannonse
Annonse

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

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 av indietrash
Lenke til kommentar
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

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
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

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 av NorthWave
Lenke til kommentar
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

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

...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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...