Tor-Bjarne Skrevet 19. februar 2008 Skrevet 19. februar 2008 Hei, jeg sitter med ett problem. Jeg kan NADA om perl scripting og har bare netopp begynnt med bash scripting. Jeg har laget ett script som fungerer med bruk av bash og sed kommandoen. Men nå skal jeg da gjøre dette i perl : Lag perl-script som gjør følgende med alle filnavn i en gitt katalog * Bytter mellomrom (space) med _ (underline) * Bytter ut æ ø å Æ Ø Å med ae oe aa AE OE AA 2. Lag et script som bytter navn på alle filer i en angitt katalog som ender på en spesiell endelse (f.eks. '.txt') til en annen (f.eks. '.doc') Da jeg har null peiling på perl bortsett fra ett enkelt hello world script, har jeg nå sittet i flere timer å lest toturials og googlet. Der er MANGE script, men ingen som jeg fårstår noe av. Er det mulig noen av dere so kan dette kan hjelpe meg `?
Torbjørn Skrevet 20. februar 2008 Skrevet 20. februar 2008 kanskje noe slikt: # gitt $directory chdir $directory or die "failed cd $directory\n"; for( glob "*" ){ (my $newfile = $_) =~ s/ /_/g; $newfile =~ s/æ/ae/g; $newfile =~ s/ø/oe/g; $newfile =~ s/å/aa/g; $newfile =~ s/Æ/AE/g; $newfile =~ s/Ø/OE/g; $newfile =~ s/Å/AA/g; rename $_, $newfile or die "failed renaming '$_' to '$newfile'\n"; }
Tor-Bjarne Skrevet 20. februar 2008 Forfatter Skrevet 20. februar 2008 kanskje noe slikt: # gitt $directory chdir $directory or die "failed cd $directory\n"; for( glob "*" ){ (my $newfile = $_) =~ s/ /_/g; $newfile =~ s/æ/ae/g; $newfile =~ s/ø/oe/g; $newfile =~ s/å/aa/g; $newfile =~ s/Æ/AE/g; $newfile =~ s/Ø/OE/g; $newfile =~ s/Å/AA/g; rename $_, $newfile or die "failed renaming '$_' to '$newfile'\n"; } Gjorde noen små endringer som var unødvendig, det fungerte som det var, tusen takk
Tor-Bjarne Skrevet 21. februar 2008 Forfatter Skrevet 21. februar 2008 Hei igjenn. Jeg lurte på om du kunne forklare hva for (glob "*") gjør ? Skriver forklaringer for scriptet.
Torbjørn Skrevet 21. februar 2008 Skrevet 21. februar 2008 fra perldoc -f glob: glob EXPR glob In list context, returns a (possibly empty) list of filename expansions on the value of EXPR such as the standard Unix shell /bin/csh would do. In scalar context, glob iterates through such filename expansions, returning undef when the list is exhausted. This is the internal function implementing the "<*.c>" operator, but you can use it directly. If EXPR is omitted, $_ is used. The "<*.c>" operator is discussed in more detail in "I/O Operators" in perlop. Beginning with v5.6.0, this operator is implemented using the standard "File::Glob" extension. See File::Glob for details. kort sagt gjør den "dir *" eller "ls" (avhengig av platform)
Tor-Bjarne Skrevet 21. februar 2008 Forfatter Skrevet 21. februar 2008 fra perldoc -f glob: glob EXPR glob In list context, returns a (possibly empty) list of filename expansions on the value of EXPR such as the standard Unix shell /bin/csh would do. In scalar context, glob iterates through such filename expansions, returning undef when the list is exhausted. This is the internal function implementing the "<*.c>" operator, but you can use it directly. If EXPR is omitted, $_ is used. The "<*.c>" operator is discussed in more detail in "I/O Operators" in perlop. Beginning with v5.6.0, this operator is implemented using the standard "File::Glob" extension. See File::Glob for details. kort sagt gjør den "dir *" eller "ls" (avhengig av platform) Takk for raskt svar ! Credit vil selvfølgeli bli gitt, selv om jeg tviler på at scriptet blir offentlig tilgjengelig!
Tor-Bjarne Skrevet 21. februar 2008 Forfatter Skrevet 21. februar 2008 (endret) #!/usr/bin/perl #### Den første linja heter "Sha Bang" #### # # # # # # # # # # # # # # # # ## __ _ _ ____ __ __ ____ ___ ____ ___ ## ## /__\ ( \( )( ___)( \/ )( ___)/ __)(_ _)/ __) ## ## /(__)\ ) ( )__) ) ( )__) \__ \ _)(_ \__ \ ## ## (__)(__) (_)\_)(____)(_/\/\_)(____)(___/(____)(___/ ## ## ____ ____ _____ ____ __ __ ___ ____ ____ _____ _ _ ## ## ( _ \( _ \( _ )( _ \( )( )/ __)(_ _)(_ _)( _ )( \( ) ## ## )___/ ) / )(_)( )(_) ))(__)(( (__ )( _)(_ )(_)( ) ( ## ## (__) (_)\_)(_____)(____/(______)\___) (__) (____)(_____)(_)\_) ## # # # # # # # # # # # # # # # # ## Dette scriptet er laget av Tor Bjarne ****mo ## ########################## ## Versjon 0.1 20.02.08 ## ## Versjon 0.2 20.02.08 ## ## Versjon 0.3 20.02.08 ## ########################## ########################################################## ## Scriptet har til hensikt å bytte ut alle ## ## forekomster av white space (space) med underscore(_) ## ########################################################## ## Angir hvilket directory som scriptet skal utføres i. $directory = "/home/tor/Desktop/Perl/"; ## Setter deg i katalogen eller filepathn som tidligere angitt i $directory,og avbryter scriptet om directoryet ikke eksisterer. chdir $directory or die "Kan ikke gå til mappen fordi den ikke eksisterer eller er blitt flyttet.\n failed cd $directory\n"; for( glob "*" ){ (my $newfile = $_); $newfile =~ s/ /_/g; $newfile =~ s/æ/ae/g; $newfile =~ s/ø/oe/g; $newfile =~ s/å/aa/g; $newfile =~ s/Æ/AE/g; $newfile =~ s/Ø/OE/g; $newfile =~ s/Å/AA/g; ## Tester om filene i katalogen er en fil eller en mappa, eer detr en mappe så vil den ikke bli overskrevet! if ( -d $_){ print "$_ er en mappe og vil ikke få nytt navn\n" ## Tester om filen du gir nytt navn til er ett navn som allerede er i bruk i katalogen og hopper over den filen! } elsif ( $_ ne $newfile ) { print "$newfile finnes allerede, og vil ikke blir skrevet over.\n" ## Om ingenting går galt så utføres koden nedenfor } else { rename $_, $newfile or die "failed renaming '$_' to '$newfile'\n"; } } print "$newfile \n"; ## Credit where credit is due: ## - Diskusjonsforum.no <-- Alltid en bra plass å gå til for hjelp! ## - Bruker: Torbjørn <- Takk for hjelpen med scriptet :) ## - Resten av Script programmerings klassen <-- Sammarbeid er snarveien til å bli hurtig ferdig og ett bra resultat! ##EOF: rename.pl Her er koden så rotete som den er. Jeg hadde ett problem... Case: Jeg oppretter 2 filer i en katalog. Den ene heter ø den andre heter oe. Når jeg gjører scriptet vil en av filene gå tapt, i dette tilfellet oe filen, da ø blir rename'et til oe og skriver over den. Jeg laget da en kode får å sjekek om navnet i $_ var like navnet i $newfile. Dette skulle da forhindre at en fil ble skrevet over. Det funket ikke Problemer med at jeg er noob sikkert hehe. Ser du noen elementære feil her så ver snill å si fra ! Endret 21. februar 2008 av Tor-Bjarne
Tor-Bjarne Skrevet 21. februar 2008 Forfatter Skrevet 21. februar 2008 Lager en ny post får ikke å rote til den gammle. Det som sjer når jeg kjører scriptet er følgende: Den printer feilmeldingen $_ er en mappe og vil ikke få nytt navn\n $newfile finnes allerede, og vil ikke blir skrevet over.\n Så åpner jeg da katalogen og ser att filen ø ikke er endret med feilmelding om at oe finnes allerede selv om den ikke eksisterer.
trtrtr Skrevet 21. februar 2008 Skrevet 21. februar 2008 sjekk om fil eksisterer med "-e" test.. if (-e $file) { print "\nfile exists..Skipping" }
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å