Gå til innhold

Endre lengden på mange filnavn


Anbefalte innlegg

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?

Lenke til kommentar
Videoannonse
Annonse

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.

Lenke til kommentar

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.

Lenke til kommentar

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? :tease::lol:

Endret av Terrasque
Lenke til kommentar
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? :tease:  :lol:

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