2011-06-28 4 views
0

1〜9の数字の先頭にゼロが付いたディレクトリ内のファイルを数えたり番号を付けたり名前を変更したりする方法を探しています。それはFile :: findに基づいていなければなりませんが、最も効率的な方法ではないかもしれませんが、後でその関数に基づいたより大きなコードに統合しなければなりません。 'File1'、 'File2'、 'File3' .... 'File10'、 'File11'などは'01になります。 File1 '、'02。 File2 '、... '10。 File10 '、'11。 FILE11' などディレクトリ内のPerl数と数値ファイル

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

find(\&rename_files, $dir_source); 
sub rename_files { 
    /\.flac$/ or return; 
    my $fd = $File::Find::dir; 
    my $fn = $File::Find::name; 
    my $file = $_; 


    rename $file, $_;  
} 

UPDATE:これは、コードは0からファイルのカウントを開始することを、1つの例外を除いて実用的なソリューションである$回数が1

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

my $dir_source = ''; 

find(\&rename_files, $dir_source); 
{ 
    my $count = 1; 
    sub rename_files { 
     return if not -f $_ or not /\.flac$/;    
     my $file = sprintf "%02d\. $_", $count++; 
     print "$file\n"; 
     rename $_, $file; 
    } 
} 
+0

あなたがしなければならないすべては '一致しようとして指名手配サブルーチンを見つける呼んでいるようです$ _ =〜/^\ d \ D/'もしそうなら、名前にファイル名の末尾に0をつけてください。ああ、それらを数えるためにいくつかのカウントvarを増やしてください。 – NorthGuard

+0

見つかったファイルの先頭に2桁の数字がない場合は、1〜9/01,02,03、... 10,11などの先頭に0を付けて名前を変更して名前を変更します。 – thebourneid

+0

@thebourneid質問を更新することはできますか? 2つのケースがあるようです。最初は桁がなく、最初に1桁しかないケースです。いくつかのサンプルファイルを追加して、それらを変更してほしいと思っているものを追加してください。例えば'1filename.txt => 01filename.txt'と' 11filename.txt => 11filename.txt' – NorthGuard

答えて

2

に設定されているが、あなたが持っていることあなたの特定のニーズに合うようにこれを調整することができますが、私は正しい方向にあなたを指すべきだと思います。ところで、 "rename $_, $file"の行をテスト/デバッグ段階では 'print "rename $_, $file\n";'に置き換えることをお勧めします。そうすれば、実行後に何が間違っていたのか分かりません。

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

find(\&rename_files, $dir_source); 

{ 
    my $count = 0; 
    sub rename_files { 
     return if not /\.flac$/; 
     my $file = $_; 
     return if not -f $file; 
     $file =~ s/^([^\d]{2})(?=\.)/sprintf "%2d$1", $count++/e; 
     rename $_, $file; 
    } 
} 

は、それはあなたのサブカウンターを与えるために$数の周りにクロージャを使用して、あなたの置換RE上/ eオプションは、ちょうどで置き換えるのではなく、sprintfのを実行するために:;)

は、ここに抜粋ですリテラル文字列。

ところで、あなたは既にFile :: Findで95%を持っていますが、将来的にはそれほど些細な作業のために、私はFile :: Find :: Ruleのきれいなインターフェースが本当に好きです。あなたはそれを見て、それが将来的にはより良いツールになるかもしれないかどうかを見てみるかもしれません。

UPDATE:次のようにあなたの元の質問への更新を考えると、私はコードを変更します:ドキュメント上で読む

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

find(\&rename_files, $dir_source); 

{ 
    my $count = 0; 
    sub rename_files { 
     return if not -f $_ or not /\.flac$/;    
     my $file = sprintf "%2d$_", ++$count; 
     rename $_, $file; 
    } 
} 
+0

DavidOありがとうございます。これらはあなたの提案から2つの2行で、いくつかのテストの後、ほとんど私のために働いています:$ file =〜s/^([^ \ d \ d \。\ s]。*)$/sprintf "%02d \。 $ 1 "、$ count ++/e; $ file = sprintf "%02d \。$ _"、$ count ++;私が理解できないのは、0からではなく1からファイルを数える方法だけです。 – thebourneid

+0

'my $ count = 0;'を 'my $ count = 1;'に変更します。 – DavidO

+0

これは私が最初にしたことですが、コードはまだ0から数え始め、最初のファイルの名前を '00'に変更して '01'にします。 – thebourneid

関連する問題