/ Forside / Teknologi / Operativsystemer / Linux / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Linux
#NavnPoint
o.v.n. 11177
peque 7911
dk 4814
e.c 2359
Uranus 1334
emesen 1334
stone47 1307
linuxrules 1214
Octon 1100
10  BjarneD 875
script til fil-rename
Fra : Preben Holm


Dato : 13-10-04 19:48

Hej gruppe,


jeg søger et script/metode til at rename filer med:

Jeg ønsker at noget####.nef skal omdøbes til noget_andet####.nef

samtidig skal #### ændres...


dvs. dsc_0011.nef skal f.eks. omdøbes til kornblomst_005.nef
dsc_0012.nef kornblomst_006.nef
dsc_0013.nef kornblomst_007.nef
dsc_0014.nef kornblomst_008.nef
dsc_0015.nef kornblomst_009.nef
...

dvs. efterhånden som mængden af filer er stor, så bliver man hurtigt
træt af at omdøbe filer manuelt.

Det skal dog siges at der godt kan lægge filer i samme bibliotek der
hedder dsc_0010.nef som ikke skal omdøbes.

Det kan også være at det der omdøbes til ikke starter fra nummer 001,
men f.eks. 005.

Jeg kan ikke helt greje hvordan det skal laves, men jeg havde tænkt mig
at scriptet skulle kaldes med f.eks.

script dsc_0 kornblomst 11 5 15

dvs. dsc_0 er starten af input filnavn
kornblomst er starten af output filnavn
11 er startnummer på input billede
5 er startnummer på output billede
15 er antallet af iterationer


Hvordan kunne man lave ovenstående script?

Som I nok allerede har fundet ud af, er det til at omdøbe billeder fra
digital-kamera når man f.eks. har taget 20 billeder af en og samme ting
og man skal have arkiveret billedet.


Mvh / Preben Holm

 
 
Peter Makholm (13-10-2004)
Kommentar
Fra : Peter Makholm


Dato : 13-10-04 20:09

Preben Holm <64bitNOnoSPAMno@mailme.dk> writes:

> jeg søger et script/metode til at rename filer med:

Jeg bruger det rename script der er i perl-distributionen til den
slags. Den simple udgave kan du finde på

http://hacking.dk/files/rename

Den store udgave med meget mere fejlhåndtering, backup og andet gejl:

http://search.cpan.org/~pederst/rename-1.4/

> dvs. dsc_0011.nef skal f.eks. omdøbes til kornblomst_005.nef
> dsc_0012.nef kornblomst_006.nef
> dsc_0013.nef kornblomst_007.nef
> dsc_0014.nef kornblomst_008.nef
> dsc_0015.nef kornblomst_009.nef
> ...

Det kunne så måske løses med:

rename 's/dsc_(\d+).nef/sprintf "kornblomst_%03d.nef", $1 - 6/e' *.nef

--
Peter Makholm | What if:
peter@makholm.net | Tanenbaum had convinced Linus that his
http://hacking.dk | operating system really was obsolete

Preben Holm (13-10-2004)
Kommentar
Fra : Preben Holm


Dato : 13-10-04 20:29

Peter Makholm wrote:
> Preben Holm <64bitNOnoSPAMno@mailme.dk> writes:
>
>
>>jeg søger et script/metode til at rename filer med:
>
>
> Jeg bruger det rename script der er i perl-distributionen til den
> slags. Den simple udgave kan du finde på
>
> http://hacking.dk/files/rename
>
> Den store udgave med meget mere fejlhåndtering, backup og andet gejl:
>
> http://search.cpan.org/~pederst/rename-1.4/
>
>
>>dvs. dsc_0011.nef skal f.eks. omdøbes til kornblomst_005.nef
>> dsc_0012.nef kornblomst_006.nef
>> dsc_0013.nef kornblomst_007.nef
>> dsc_0014.nef kornblomst_008.nef
>> dsc_0015.nef kornblomst_009.nef
>> ...
>
>
> Det kunne så måske løses med:
>
> rename 's/dsc_(\d+).nef/sprintf "kornblomst_%03d.nef", $1 - 6/e' *.nef

Det kræver vist lidt forklaring?
Hvad betyder "s/", "(\d+)", "/sprintf", "$1 - 6/e"

Jeg gætter mig til at "%03d" er det der nummererer filen med 3
decimaler, men ellers er jeg lidt lost!


Kører en gentoo box med alt muligt installeret

smider jeg din kommando på prompten sker der ingenting! hvad og hvorfor
gør jeg noget forkert?
har aldrig rigtig arbejdet med perl:!


Mvh / Preben Holm

Peter Makholm (14-10-2004)
Kommentar
Fra : Peter Makholm


Dato : 14-10-04 09:03

Preben Holm <64bitNOnoSPAMno@mailme.dk> writes:

>> rename 's/dsc_(\d+).nef/sprintf "kornblomst_%03d.nef", $1 - 6/e'
>> *.nef
>
> Det kræver vist lidt forklaring?
> Hvad betyder "s/", "(\d+)", "/sprintf", "$1 - 6/e"

Det er et perludtryk der laver den ønskede transformation.

's/xxx/yyy/' udføre en substition på filnavnet. xxx er et regulært
udtryk der skal udskiftes og yyy er det det skal udskiftes
med. Normalt vil yyy bare blive indsat istedet for det som xxx matche,
men på grund af e'et 's/xxx/yyy/e' bliver yyy udført som perludtryk og
resultatet bliver indsat.

'sprintf "kornblomst_%03d.nef", $1 - 6' laver det nye filnavn. %03d er
rigtig nok det der nummererer filen med tre decimaler. Det tal den
bruger er nummeret fra den gamle fil og trækker 6 fra. $1 kommer fra
parenteserne i det regulære udtryk.

Det regulære udtryk 'dsc_(\d+).nef' finder tegnene 'dsc_' efterfulgt
af en række tal, som gemmes i $1, efterfulgt af et tegn efterfulgt af
'nef'.


> Kører en gentoo box med alt muligt installeret

Og du bruger det script jeg henviste til?

> smider jeg din kommando på prompten sker der ingenting! hvad og
> hvorfor gør jeg noget forkert?

Og du bruger ikke det inferiøre rename-program som ligger i
util-linux?


--
Peter Makholm | The four letter word beginning with L?
peter@makholm.net | It's life, love, libc or lisp
http://hacking.dk | -- Depending on you point of view

Preben Holm (14-10-2004)
Kommentar
Fra : Preben Holm


Dato : 14-10-04 14:58

Peter Makholm wrote:
> Preben Holm <64bitNOnoSPAMno@mailme.dk> writes:
>
>
>>>rename 's/dsc_(\d+).nef/sprintf "kornblomst_%03d.nef", $1 - 6/e'
>>>*.nef
>>
>>Det kræver vist lidt forklaring?
>>Hvad betyder "s/", "(\d+)", "/sprintf", "$1 - 6/e"
>
>
> Det er et perludtryk der laver den ønskede transformation.
>
> 's/xxx/yyy/' udføre en substition på filnavnet. xxx er et regulært
> udtryk der skal udskiftes og yyy er det det skal udskiftes
> med. Normalt vil yyy bare blive indsat istedet for det som xxx matche,
> men på grund af e'et 's/xxx/yyy/e' bliver yyy udført som perludtryk og
> resultatet bliver indsat.
>
> 'sprintf "kornblomst_%03d.nef", $1 - 6' laver det nye filnavn. %03d er
> rigtig nok det der nummererer filen med tre decimaler. Det tal den
> bruger er nummeret fra den gamle fil og trækker 6 fra. $1 kommer fra
> parenteserne i det regulære udtryk.
>
> Det regulære udtryk 'dsc_(\d+).nef' finder tegnene 'dsc_' efterfulgt
> af en række tal, som gemmes i $1, efterfulgt af et tegn efterfulgt af
> 'nef'.
>
>
>
>>Kører en gentoo box med alt muligt installeret
>
>
> Og du bruger det script jeg henviste til?
>
>
>>smider jeg din kommando på prompten sker der ingenting! hvad og
>>hvorfor gør jeg noget forkert?
>
>
> Og du bruger ikke det inferiøre rename-program som ligger i
> util-linux?
>
>

Tak, fik det til at virke... skulle jo lige være ./rename ehh, btw.
dit script virker sådan nogen lunde, men ikke optimalt jo - jeg kan
stadig ikke sige at i går fra 5 til 10 hvis jeg nu kun ønsker at billede
5 til 10 skal have det filnavn.


Mvh / Preben Holm

Peter Makholm (14-10-2004)
Kommentar
Fra : Peter Makholm


Dato : 14-10-04 15:37

Preben Holm <64bitNOnoSPAMno@mailme.dk> writes:

> Tak, fik det til at virke... skulle jo lige være ./rename ehh,
> btw. dit script virker sådan nogen lunde, men ikke optimalt jo - jeg
> kan stadig ikke sige at i går fra 5 til 10 hvis jeg nu kun ønsker at
> billede 5 til 10 skal have det filnavn.

Jeg er ikke helt sikker på hvad du vil.

Hvis du kun vil omnavngive en sekvens af billeder så kan du måske:

rename '/dsc_(\d+).nef/ && $1 >= 5 && $1 <= 10 && $_ = sprintf "kornblomst_%03d.nef", ++$a' *.nef

Men så skal du snart til at kunne noget perl.

Alternativt skal du skrive noget andet end *.nef som kun globber til
de filer du skal have omnavngivet. Måske en wrapper uden om
rename. Følgende er totalt uprøvet, udokumenteret og uden fejlkontrol
af betydning.

#!/bin/sh

if [ $# -eq 3 -o $# -eq 4]
echo "usage: $0 <nytnavn> <min> <max> [<dir>]"
fi

/path/to/rename "/dsc_(\d+).nef/ && \$1 >= $2 && \$1 <= $3 && \$_ = sprintf '$1_%03d.nef', ++\$a" ${4:-.}/*.nef

<cut>

Hold tungen lige i munden. Når der står \$ er det perl-variable ($1,
$_ og $a) og når der bare står $ er det sh-variable ($0,$1,$2,$3). Pas
især på med \$1 og $1 - det er to helt forskellige ting.


--
Peter Makholm | We constantly have to keep in mind why natural
peter@makholm.net | languages are good at what they're good at. And to
http://hacking.dk | never forget that Perl is a human language first,
| and a computer language second

Niels Elgaard Larsen (16-10-2004)
Kommentar
Fra : Niels Elgaard Larsen


Dato : 16-10-04 14:52

Preben Holm skrev:

> Hej gruppe,
>
>
> jeg søger et script/metode til at rename filer med:
>
> Jeg ønsker at noget####.nef skal omdøbes til noget_andet####.nef
>
> samtidig skal #### ændres...
>
>
> dvs. dsc_0011.nef skal f.eks. omdøbes til kornblomst_005.nef
> dsc_0012.nef kornblomst_006.nef
> dsc_0013.nef kornblomst_007.nef
> dsc_0014.nef kornblomst_008.nef
> dsc_0015.nef kornblomst_009.nef
> ...
>
> dvs. efterhånden som mængden af filer er stor, så bliver man hurtigt
> træt af at omdøbe filer manuelt.

Du kan bruge mmv
mmv "dsc_*" "kornblomst#1"

> Det skal dog siges at der godt kan lægge filer i samme bibliotek der
> hedder dsc_0010.nef som ikke skal omdøbes.

> Det kan også være at det der omdøbes til ikke starter fra nummer 001,
> men f.eks. 005.
>
> Jeg kan ikke helt greje hvordan det skal laves, men jeg havde tænkt mig
> at scriptet skulle kaldes med f.eks.
>
> script dsc_0 kornblomst 11 5 15
>
> dvs. dsc_0 er starten af input filnavn
> kornblomst er starten af output filnavn
> 11 er startnummer på input billede
> 5 er startnummer på output billede
> 15 er antallet af iterationer
>
>
> Hvordan kunne man lave ovenstående script?

I bash:
function omdob() for bi in $(seq $3 $(expr $3 + $5)); do mv $(printf
"%s%04d.nef" $1 $bi) $(printf "%s%04d.nef" $2 $(expr $bi + $4 - $3)); done

Kald som omdob dsc_ kornblomst 11 5 15
--
Niels Elgaard Larsen
http://www.agol.dk/elgaard

Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408849
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste