2010-12-30 6 views
2

Ich muss alle Bilder umbenennen, wie der Titel in allen Unterordnern erklärt. Ich denke, mit Regex die Zahl innerhalb der Klammer zu extrahieren und dann umzubenennen. In der Umgebung habe ich gesehen, dass es Werkzeuge wie rename und mmv gibt, aber ich konnte sie nicht dazu bringen, die JPGs umzubenennen.Zero Pad umbenennen z.B. Bild (2) .jpg -> Bild (002) .jpg

Ich werde jede Beratung schätzen, um mein Problem anzugehen.

BTW: ist für Windows und ich habe cygwin bash und perl.

Bearbeiten:
Schlussfolgerungen nach dem Experimentieren mit allen Antworten.

  1. Cygwin rename ist nicht gut, die ich an der Arbeit konnte nicht regex akzeptieren, aber auf jeden Fall eine gute Wahl, zum Beispiel durch Ausführen einer Linux-VM und Bereitstellen eines Win SharedFolders.
  2. Sie können ein besseres rename Werkzeug für Cygwin mit this shell script mit sed erstellen.
  3. Das Windows-Äquivalent für pwd ist einfach cd.
  4. Hugmeir gepostet eine vielversprechende Lösung mit Perl 5.13+, die dev-Releases sind, aber zu der Zeit, die Sie dies lesen, wahrscheinlich wird das stabil sein.
  5. Die Untergruppe pad_left ist möglicherweise keine bessere Alternative zur printf-Syntax, aber sie funktioniert.

Antwort

1

Der folgende Code wurde unter Linux getestet; Ich weiß nicht, was Sie ändern müssen, damit es in Ihrer Umgebung funktioniert. Außerdem habe ich keine Suche nach Unterverzeichnissen für JPG-Dateien vorgenommen. Wenn Sie möchten, dass ich den Code auf diese Weise modifiziere, lassen Sie es mich wissen.

(EDIT: für eine Unterverzeichnisse weite Suche finden Sie in der Programmversion weiter unten)

use strict; 
use warnings; 

sub pad_left { 
    my $num = shift; 

    if ($num < 10) { 
     $num = "00$num"; 
    } 
    elsif ($num < 100) { 
     $num = "0$num"; 
    } 

    return $num; 
} 

my @files = glob "*.jpg"; 

my @padded_names = map { 
          my $name = $_; 
          $name =~ s/^([\w ]+\()(\d+)\)/$1 . &pad_left($2) .')'/e; 
          $name; 
         } @files; 

foreach (0..$#files) { 
    rename($files[$_], $padded_names[$_]); 
    print "$files[$_] --> $padded_names[$_]\n"; 
} 

Das obige Programm benennt die Dateien und druckt die folgenden:

file(1).jpg --> file(001).jpg 
file(2).jpg --> file(002).jpg 
file(20).jpg --> file(020).jpg 
file(200).jpg --> file(200).jpg 

HTH

EDIT: Hier ist eine verbesserte Version der abov Das Programm - es umfasst jetzt auch die Suche von Unterverzeichnissen für JPG-Dateien. Ich weiß, dass mein Code nicht mehr erforderlich ist, wie jetzt eine Antwort des Unterverzeichnis Problem Adressierung gegeben worden ist, aber hey ... :)

use strict; 
use warnings; 
use File::Find; 

sub pad_left { 
    my $num = shift; 

    if ($num < 10) { 
     $num = "00$num"; 
    } 
    elsif ($num < 100) { 
     $num = "0$num"; 
    } 

    return $num; 
} 

sub new_name { 
    if (/\.jpg$/) { 
     my $name = $File::Find::name; 
     my $new_name; 
     ($new_name = $name) =~ s/^(.+\/[\w ]+\()(\d+)\)/$1 . &pad_left($2) .')'/e; 
     rename($name, $new_name); 
     print "$name --> $new_name\n"; 
    } 
} 

chomp(my $localdir = `pwd`);# invoke the script in the parent-directory of the 
          # image-containing sub-directories 

find(\&new_name, $localdir); 
+0

wow das war schnell! vielen Dank. wenn es dich nicht stört, bitte hilf mir auch bei den Untertanen. –

+0

@Eric Fortis Ok, ich werde es versuchen :) Warten Sie ein paar Minuten. – canavanin

+0

@Eric Fortis Hab 'mich etwas herumgespielt, habe länger gebraucht als erwartet> _ canavanin

7

Der rename Befehl könnte das tun:

rename 's/\d+/sprintf("%03d",$&)/e' *.jpg 

mit Unterverzeichnissen:

find . -type f -name \*.jpg -print0|xargs -0 rename 's/\d+/sprintf("%03d",$&)/e' 
+0

danke für die Beratung Herr István –

+0

eigentlich ist es Herr Karaszi, aber was auch immer;) –

+0

Sieht aus wie keine Mühe mehr auf meiner Seite dann erforderlich ist :) – canavanin

1
perl -MFile::Find::Rule -E 'rename($_, s/ \(\K ([0-9]+) (?= \))/sprintf("%03s", $1) /rex) for File::Find::Rule->file->name("*.jpg")->in($ARGV[0])' directory_here 

Dies wird nur wenn auch mit 5.13+ Perls arbeiten, aufgrund des/r flag .

EDIT: Für Windows müssen Sie die äußeren Anführungszeichen mit Anführungszeichen ändern, und entweder die Sprintf und den Namen, oder verwenden Sie ein anderes delimtier, ala qq!% 03d!

EDIT2: Woah, total vermasselt meine Begrenzer dort.

+0

danke ich werde auch damit spielen. –

+0

Eine abwärtskompatible Version: perl -MFile :: Find :: Rule -E "für (Datei :: Find :: Rule-> Datei-> Name (q! *. Txt!) -> in ('C:/Meine Dropbox ')) {(my $ newname = $ _) = ~ s/\ (\ K ([0-9] +) (? = \))/Sprintf (qq!% 03s !, $ 1)/ex; Umbenennen $ _, $ newname} " – Hugmeir

+1

Hier ist ein Link zu brian d foy Blog über die neue/r Flagge http://www.effectiveperlprogramming.com/blog/659 –

0

Wieder auf einem tangentialen Pfad, wenn Sie auf Windows und Ihr Ziel ist es, Dateien umzubenennen, anstatt einige Programmierung), versuchen Freeware Siren (http://www.scarabee-software.net/en/siren. html) Es tut genau das, was benötigt wird, z versuchen Sie den folgenden Ausdruck Image \(%N1{3}\).%le. Schauen Sie sich speziell die %X* Ausdrücke an, die speziell für Bilder geeignet sind.