Gå til innhold

Endre filnavnet på alle .htm filer i en mappe fra UC til lc


Anbefalte innlegg

Hei alle sammen.

 

Jeg fant ut her en dag at jeg skulle sette opp Microsoft ISA serveren vår til å rapportere nettbruk en gang i uka til en apache web server på nyeste versjon av Ubuntu server.

 

bør nevne at jeg har veldig lite erfaring med Linux, og det meste jeg har satt opp er ved hjelp av veiledninger.

 

Problemet er at Microsoft selvfølgelig ikke bryr seg om casesensitive systemer, og har derfor funnet det for godt å lage alle filer til raporten med store forbokstaver.

 

Problemet er i html koden i .htm filene.

Der peker det til .htm filene med små forbokstaver, mens alle bilder pekes til med store forbokstaver.

 

Som dere kanskje skjønner så er ikke Ubuntu servern så veldig glad i det.

 

Jeg søkte litt på nettet og kom over en kommando:

find my_root_dir -depth -exec rename 's/(.*)\/([^\/]*)/$1\/\L$2/' {} \;

 

problemet er at denne gjør alle filene til små bokstaver.

Jeg så litt på koden og ser at det er ett punkt hvor det står .* og tenkte at denne sikkert velger hvilken filer som skal endres (basert på fil etternavn). dette var det ikke og det endte med at ingen endringer ble gjort (i hvertfall som jeg kan se).

 

Jeg lurte derfor på om noen kunne hjelpe meg med å enten få endret den kommandoen jeg har, eller om dere har noen andre gode ideer til hvordan jeg løser dette.

 

Ett annet problem som jeg trenger hjelp med (er i denne sammenheng), er at disse rapportene lages en gang i uka.

Den vil da opprette en ny mappe med den nye rapporten, og denne må jo da også endres i forhold til store og små bokstaver.

 

Det å få kjørt skriptet en gang i uka etter at rapporten er laget er nok ikke noe problem, selv om noen gode ideer blir godt mottatt.

 

Problemer derimot er hva må jeg gjøre for at den endelige kommandoen eller skriptet skal ta hensyn til at mappenavnet er endret?

 

Alle filene ligger på følgende mappe bane:

/var/www/isalogger/testrapport3_\(4.14.2009-4.14.2009\)/

Dato merkingen vil jo da være endret hver uke, og den vil være fra første dag i uka til siste dag i uka. (rapporten vil kjøres hver mandag, og er for mandag til søndag uka før). der hvor det står testrapport3 vil også være annerledes etter hvilket navn jeg gir den endelige rapport jobben, men for nå så kan dere bruke testrapport3, så kan jeg endre dette senere.

Da er det endelige som må endres hver uke i skriptet, hvilken dato det er for.

 

Jeg ser nå også at ubuntu legger til "\" rett før ( og ) i filbanen, men når jeg prøver å bruke filbanen med "\" i en ls kommando så funker det helt fint, så jeg regner med at disse er bare er der fordi linux ikke er glad i parantes i filbanen eller noe slikt. Dette vet nok dere bedre enn meg.

 

Merk også at alt arbeidet skjer over ssh med putty, men jeg kan jobbe lokalt på serveren om det skulle være behov for det.

 

Om det har noe å si, så er serveren også satt opp med samba med AD autentisering, og den har mappen /var/www/isalogger/ delt.

 

Så en oppsummering av hva jeg trenger hjelp med:

 

1. En kommando eller ett skript som endrer alle .htm filer i en mappe til bare små bokstaver, mens alle andre filer i samme mappe forblir slik de var før.

 

2. En måte å kjøre kommandoen eller skriptet mandag hver uke, men hvor filbanen i kommandoen/skriptet er endret til å reflektere datoene i den nye rapporten.

 

Sånn! Det ble ganske mye, mye av det som jeg nesten ikke skjønner selv ^_^

Men jeg håper dere skjønner hva jeg ønsker, og har mulighet til å hjelpe meg. Trenger dere mer info så bare si ifra.

Merk også at de/n som klarer å hjelpe meg vil bli tilbedt som gud/er.

Endret av fatalicus
Lenke til kommentar
Videoannonse
Annonse

~/tmp$ touch Slik.htm Eller.htm Sånn.tog
~/tmp$ ls
Eller.htm  rename.sh  Slik.htm  Sånn.tog
~/tmp$ ./rename.sh 
~/tmp$ ls
eller.htm  rename.sh  slik.htm  Sånn.tog
~/tmp$ cat rename.sh 
for F in *.htm;
do mv $F `echo $F | tr '[A-Z]' '[a-z]'`
done;

 

http://lists.debian.org/debian-user/1998/10/msg00877.html

 

å få dette scriptet (rename.sh) til å jobbe i riktig mappe gjør du ved å bruke litt bash-magi til å sette sammen den riktige banen og sette den inn foran $F og `echo (men test det først, ikke ta meg på ordet, jeg burde ha sovet for lenge siden)

Endret av Kagee
Lenke til kommentar

Blir en liten bump med oppdatering.

 

Jeg opprettet en renhtml.sh (ga den ett annet navn en rename, da jeg vil være 100% sikker på at den ikke kødder med rename kommandoen), og kjørte den når den lå i samme mappe som .htm filene osv og den fungerte helt fint.

 

Det eneste jeg trenger nå er å få skriptet til å kjøre i riktig mappe, og der trenger jeg nok mer hjelp en rådet å bruke "bash-magi" :!:

 

[OPPDATERING]

 

Nå har jeg letet ltt rundt i dag, og kommet over noen saker som kanskje kan hjelpe meg med å få til dette med å kjøre i riktig mappe osv.

 

kommandoen er inotifywait.

 

Etter det jeg har skjønt så skal jeg kunne sette opp denne slik at den overvåker /var/www/isalogger/ mappen. Så når en ny mappe opprettes der så kan inotifywait legge navnet på den mappen inn i en variabel som f.eks. $isamappe

 

Da kan jeg jo igjen bruke den variablen til å få kjørt i riktig mappe.

 

Jeg skal leke meg litt med denne kommandoen ut over dagen når jeg har tid, men om noen har noen gode ideer så er de alltid velkommen.

 

(EDIT: drepte leif som var på besøk og lagt inn litt mer info)

Endret av fatalicus
Lenke til kommentar
  • 2 uker senere...

Nå er jeg på siste innspurt!

 

Har nå sjekket litt rundt på nettet og fått til ett skript som kjører inotifywait og ordner med mapper osv.

 

#!/bin/bash

echo start

inotifywait --monitor --format %f -e create /var/www/isalogger | while read file; do echo "New files moved in $file";

cp /var/www/renhtml.sh /var/www/isalogger/$file/renhtml.sh

./var/www/isalogger/$file/renhtml.sh

done

 

Denne la jeg i /etc/init.d/ (jeg trodde det var slik at de skriptene som ligger der starter ved oppstart, noe som ikke stemmer, men det kan jeg fikse senere)

 

Når jeg startet skriptet manuelt så ligger den å kjører helt fint.

 

Prøvde å generere en rapport, og skriptet fanget opp at mappen ble generert.

 

Den kopierte renhtml.sh skriptet inn i riktig mappe.

 

Problemet nå er når den skal kjøre renhtml.sh

Da kommer den med følgende feilmelding:

/etc/init.d/startupren: line 9: ./var/www/isalogger/testreportferdig_(4.26.2009-4.26.2009)/renhtml.sh: No such file or directory

 

Jeg prøvde å kjøre skriptet manuelt og fikk samme beskjed. Men når jeg prøvde å kjøre det med \ før og etter parantes i filbanen (skrevet om dette i første posten), så startet skriptet fint.

 

Så det eneste jeg trenger nå er hjelp til å få skriptet til å kjøre.

 

Jeg blir veldig glad om noen kan hjelpe meg. Jeg kan smake seieren allerede!

 

[Oppdatering]

 

Jeg har nå fått til å kjøre skriptet.

 

Bruker samme skript som over, men i stede for å kjøre skriptet med hele banen, så tar jeg en cd in i mappen og kjører det der. da funket det helt fint.

 

#!/bin/bash

echo start

inotifywait --monitor --format %f -e create /var/www/isalogger | while read file; do echo "New files moved in $file";

cp /var/www/renhtml.sh /var/www/isalogger/$file/renhtml.sh

cd /var/www/isalogger/$file/

./renhtml.sh

done

 

Det eneste jeg mangler nå er å få kjørt skriptet ved oppstart.

Her har jeg kommet langt nok til at jeg fikk brukt update-rc.d til å legge inn skriptet i rc*.d ene.

Men jeg sliter med at oppstarten stopper så fort han kommer til mitt skript.

 

for å legge til skriptet bruke jeg:

update-rc.d -f startupren start 99 2 3 4 5 .

Da skal så vidt jeg har skjønt skriptet legges inn til å kjøre i oppstart og som sist i rekken av programmer som skal starte.

 

Når jeg så tar en restart så laster alle skriptete men når mitt skript kommer så sier den at den setter opp watches, for så å ikke gjøre noe mer (ingen pålogging kommer opp). prøvde å legge til -qq i inotifywait kommandoen, men dette hjalp ikke.

 

Jeg tenkte at det sikkert ikke gjorde noe, da jeg fortsatt kan logge inn med putty, så jeg testet å opprette en rapport når skriptet starter i oppstart, men det ser ikke ut til at skriptet fanger opp de nye rapportene eller at skriptet ikke kjører riktig, da ingen av .htm filene blir endret.

 

Om noen har noen ideer så kom med dem!

Endret av fatalicus
Lenke til kommentar

quad-post! yay!

 

Da har jeg bortimot gitt opp å komme noe lengre med denne saken.

Jeg har en del andre prosjekter her på jobben som jeg nå må gi prioritet, så jeg har ikke tid til å jobbe lengre med dette for nå.

 

Jeg har ikke fått til å starte opp skriptet ved oppstart,uten at skriptet stopper hele oppstarts prosessen, men det får jeg leve med for nå. Jeg kan jo se mer på det senere.

 

For nå så starter jeg manuelt opp skriptet lokalt på linux boksen slik at det kan kjøre der.

Da får jeg fortsatt logget inn med putty uten problemer.

 

Takk til Kagee, som faktisk var den eneste som gadd å gi noe svar, til tross for nesten 200 visninger av tråden. Jeg er snart ferdig med å bygge ett tempel tild in ære Kagee.

Endret av fatalicus
Lenke til kommentar

MANDAG_DATO=`date +%d`		   # Forutsetter at script kjøres av
MANDAG_UNIX_TIMESTAMP=`date +%s` # feks cron på en mandag

SYV_DAGER_I_SEKUNDER=604800

SONDAG_UNIX_TIMESTAMP=$(($MANDAG_UNIX_TIMESTAMP+$SYV_DAGER_I_SEKUNDER))
SONDAG_DATO=`date -d @$SONDAG_UNIX_TIMESTAMP +%d`

MAANED_AAR_MANDAG=`date +.%m.%Y`
MAANED_AAR_SONDAG=`date -d @$SONDAG_UNIX_TIMESTAMP +.%m.%Y` #søndag kan være neste år eller måned

MANDAG_DATO=$MANDAG_DATO$MAANED_AAR_MANDAG
SONDAG_DATO=$SONDAG_DATO$MAANED_AAR_SONDAG

TESTDEL="testrapport3"

bane="/var/www/isalogger/$TESTDEL_($MANDAG_DATO-$SONDAG_DATO)"

cd $bane

for F in *.htm;
do mv $F `echo $F | tr '[A-Z]' '[a-z]'`
done;

 

Så sant du fikser TESTDEL-variabelen, og får dette scriptet til å kjøre hver mandag etter at overføringen er fullfør, så burde den fungere.

 

Du kan kjøre den på et bestemt tidspunkt med f.eks cron

 

 

Antagelig er det mange som har lest og blitt skremt av den store tekstmengden i første posten din. Slike spm kan også med flaks bli spurt i Forum > Data > Programvare > GNU/Linux

Endret av Kagee
Lenke til kommentar

Dersom du starter opp scripte manuelt, vil det da returnere eller vil det kjøre? Dersom jeg ikke tar helt feil, så er det meningen at sånne script skal bare starte opp en daemon eller lignende, og det er ikke meningen av selve scriptet skal stå og kjøre.

 

Nå er jeg ikke så flink i bash, og dette her er 100% uprøvd:

 

lokasjon: /usr/local/bin/fixfilenames

#!/bin/bash

FROM=".HTML"
TO=".html"

inotifywait --monitor --format %f -e create /var/www/isalogger | while read folder; do 
echo "New files moved in $folder";
for file in `ls $folder | grep $FROM; do
	mv "$folder/$file" "$folder/`basename $file $FROM`$TO"
done
done

 

scriptet som kjører i oppstart:

#!/bin/bash
/usr/local/bin/fixfilenames &

Endret av Blackslash
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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...