Gå til innhold

Endre lengden på mange filnavn


Anbefalte innlegg

Skrevet

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?

Videoannonse
Annonse
Skrevet

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.

Skrevet (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 av Cronius
Skrevet (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 av mikis
Skrevet

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.

Skrevet

Takk Cronius :thumbup:

 

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.

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

Endret av Terrasque
Skrevet (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? :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

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