2010-12-30 23 views
2

すべての画像の名前を変更する必要があります。私はregexで括弧内の数字を抽出し、名前を変更することを考えています。私の周りを検索すると、renamemmvのようなツールがあることがわかりましたが、jpgをパッド名を変更することができませんでした。ゼロパッドの名前変更。画像(2).jpg - >画像(002).jpg

私の問題に取り組むことをお勧めします。

BTW:Windows用で、私はcygwin bashとperlを持っています。

編集:すべての答えを使って実験した後
結論。

  1. Cygwinのrenameは、私が仕事に得ることができる1は、正規表現を受け入れていない、良いではありませんが、間違いなく素敵なオプション、例えばLinux VMを実行してWin SharedFolderをマウントします。
  2. this shell scriptを使用して、を使用して、より良いrenameツールをCygwin用に構築することができます。
  3. pwdのWindows対応版は、単にcdです。
  4. Hugmeirは、devリリースであるPerl 5.13+を使用した有望なソリューションを投稿しましたが、これを読んでいるときはおそらく安定しているはずです。
  5. pad_leftサブコマンドは、printf構文の代わりとしてはうまくいかないかもしれませんが、機能します。

答えて

1

以下のコードはLinuxでテストされています。自分の環境で動作させるためには、何を修正する必要があるのか​​分かりません。さらに、私は.jpgファイルのサブディレクトリの検索を含まなかった。このようにコードを修正したい場合は、私に教えてください。

EDIT:サブディレクトリ全体の検索のための、さらに下のプログラムのバージョンを参照してください)

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"; 
} 

上記のプログラムは、ファイルの名前を変更し、次のように出力されます

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

編集:ここでは、改善されたバージョンのabov eプログラム - これは現在、.jpgファイル用のサブディレクトリの検索も組み込んでいます。私はrenameコマンドはそれを行うことができ、私のコードは、もはや今のサブディレクトリの問題に対処する答えが与えられていることにより、として必要とされて知っていませんが、ちょっと... :)

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

すごい!どうもありがとうございました。それがあなたを気にしないなら、はい、私もサブディレクトリで私を助けてください。 –

+0

@エリック・フォルティスオクラホマ、私はそれに行くだろう:)ちょっと待ってください。 – canavanin

+0

@エリック・フォルティス少し遊んでいて、予想以上に長い時間がかかっていました> _ canavanin

7

rename 's/\d+/sprintf("%03d",$&)/e' *.jpg 
サブディレクトリで

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

アドバイスIstván氏のおかげでありがとう –

+0

実際にそれはカラシ氏ですが、何でも;) –

+0

私の側にはそれ以上の努力が必要ないように見えます:) – 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 

これが唯一の原因/ rフラグに、しかし5.13+のPerlで動作します。

編集:Windowsでは、二重引用符で外側の引用符を変更し、sprintfと名前のものをエスケープするか、別の区切り文字、ala qq!%03d!を使用する必要があります。

EDIT2:うわー、私の区切り文字を完全に台無しにしました。

+0

私もこれで遊ぶことに感謝します。 –

+0

下位互換性のあるバージョン:perl -File :: Find :: Rule -E "(File :: Find :: Rule-> file-> name(q!*。txt!) - > in( 'C:私のDropbox ')){(私$ newname = $ _)=〜s/\(\ K([0-9] +)(?= \))/ sprintf(qq!%03s !, $ 1)/ ex;名前の変更$ _、$ newname} " – Hugmeir

+1

新しい/ rフラグについてのbrian d foyのブログへのリンクhttp://www.effectiveperlprogramming.com/blog/659 –

0

また、接線方向のパス上で、ウィンドウ上で目標を設定するのではなく、ファイルの名前を変更する)、フリーウェアのSiren(http://www.scarabee-software.net/en/siren)を試してください。 html)それはまさに何が必要なのですか?次の式Image \(%N1{3}\).%leを試してください。具体的には、具体的にイメージを扱う式%X*をチェックしてください。

関連する問題