mikis Skrevet 25. januar 2005 Skrevet 25. januar 2005 Jeg skal overføre mange filer til Xboxen min. Filsystemet på Xboxen tillater bare 42 tegn, så jeg må endre lengden på filnavnene. Det er snakk om over 14000 filer, så det er utelukket å endre filnavnene manuelt. Den beste løsningen ville være å lage et enkelt bash script som teller tegnene i hvert filnavn, og deretter fjerner "overflødige" tegn. Her er et eksempel. Jeg vil gjerne endre denne filen: 2 Pak Special Dark Blue - Planet Patrol,Wall Defender (1990) (HES) (PAL) [!].bin til noe slikt: 2 Pak Special Dark Blue - Planet Patrol.bin Er det noen som kan hjelpe meg på vei?
mysjkin Skrevet 25. januar 2005 Skrevet 25. januar 2005 Tja, litt på vei, i hvert fall... Jeg bruker dette perl-scriptet: #!/usr/bin/perl -w foreach (@ARGV){ $name = lc($_); rename($_, $name); } for å gjøre om filnavn fra store til små bokstaver (et stadig problem med et program jeg kjører på HP/UX) Linjen $name=lc($_) er den som 'beregner' det nye navnet, så den bør jo kunne byttes ut med litt mer avansert mekanikk for å korte ned navnet. noe slikt som: m/\.(\w*?)$/; # Tar vare på tegnene etter siste . i filnavnet $ext=$1; $name=substr($_,1,41-length($ext)).".$ext"; # Plukker tegn fra starten som gir en totallende på navnet på 42 tegn når .$ext settes på igjen. Dette blir jo ikke noe 'pene' filnavn, men med perl er det ikke noe problem å plukke ut dersom du har elementer som du vet kan slettes ( (1990) (HES) (PAL) [!] i eksemplet) og å klippe til siste hele ord før navnet blir for langt el.l.. NB, vær forsiktig med koden over... jeg har ikke testet den (m/\.(\w*?)$/; etc.) Dersom du synes dette ser lovende ut, bør kanskje tråden flyttes over til perl-forumet, der skjer det relativt lite... M.
Cronius Skrevet 25. januar 2005 Skrevet 25. januar 2005 (endret) Hva slags filsystem er det snakk om? Sikker på at man ikke kan legge til f.eks. 'check=strict' som et valg til mount for å få Linux til å fikse navnene 'on the fly' ved kopiering? Endret 25. januar 2005 av Cronius
Terrasque Skrevet 25. januar 2005 Skrevet 25. januar 2005 distro'en min har et perl script som heter "rename" som bruker perl's regex replace. Den bør være relativ enkel å bruke
mikis Skrevet 26. januar 2005 Forfatter Skrevet 26. januar 2005 (endret) Filsystemet er Xfat. Står litt om filsystemet og filnavn restriksjoner her Når det gjelder overføring, gjøres dette med ftp. Endret 26. januar 2005 av mikis
Cronius Skrevet 26. januar 2005 Skrevet 26. januar 2005 Var bare en teori, hvis den ikke blir mounta lokalt hjelper det lite uansett Men se på denne bash-setningen: for i in *; do if [ ! -d "$i" ]; then echo `echo $i | cut -d. -f1 | cut -b0-37`.`echo $i | cut -d. -f2 | cut -b0-3`; fi; done Den er har jeg prøvd selv og er ufarlig å kjøre, men den funker ikke hvis filnavnet har punktum mer enn ett sted... Denne derimot: for i in *; do if [ ! -d "$i" ]; then mv "$i" "`echo $i | cut -d. -f1 | cut -b0-37`.`echo $i | cut -d. -f2 | cut -b0-3`"; fi; done Har jeg ikke prøvd selv, men bør kanskje muligens funke, men INGEN GARANTIER naturligvis Du bør ta kopier av det du prøver dette på før du prøver det.
mikis Skrevet 26. januar 2005 Forfatter Skrevet 26. januar 2005 Takk Cronius Det var noe slik jeg var ute etter. Skriptet fungerer! Da har jeg et godt utgangspunkt for videre funksjonalitet. Jeg vil nemlig at skriptet skal "rense" filnavnene rekursivt i mappestrukturen.
Terrasque Skrevet 26. januar 2005 Skrevet 26. januar 2005 (endret) rename -n 's/(.{39}).*(\..{1,3}$)/$1$2/' <filnavnene> regex :-) s/<ting>/<tang>/ -> Substitute ting med tang Først velger den de 42 første chars'ene. .{42} = . er match any character, og repeat 42 times. Siden den er inni paranteser, blir det en gruppe ($1 siden det er første), så velges alle andre char's, så velges første punktum (pga \ foran regnes det som et faktisk punktum), så de 1-3 neste characters (filending), og til slutt $ som betyr slutten på filnavnet i en gruppe nr to. Mer: http://www.informatik.uni-trier.de/~smith/...9/29.04.99.html Når rename kjøres med -n viser den bare hva den ville gjort, så les igjennom først, sjekk at alt er som det skal, og så kjør uten -n hvis det ikke var noen problemer. EDIT: Buhuu... litt for sent ute EDIT2: Cronius - slike ting MÅ jo bare løses med regex da Eier du ikke bjeller? Endret 26. januar 2005 av Terrasque
Cronius Skrevet 26. januar 2005 Skrevet 26. januar 2005 (endret) rename -n 's/(.{39}).*(\..{1,3}$)/$1$2/' <filnavnene> regex :-) EDIT2: Cronius - slike ting MÅ jo bare løses med regex da Eier du ikke bjeller? Helt klart, regex er imponerende kraftig, og en vakker dag skal jeg lære meg både det og sed, men noen ting er mer interessant å lære enn andre Endret 26. januar 2005 av Cronius
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å