0

データベース内のディレクトリにある一連の画像のコードの名前を、Perlを使用して新しいものに変更しようとしています。コードの形式はですXXXX_XXXX_V1.jpg。私がする必要があるのはXXXX_XXXX、デザイナーによって入力された新しいコードに置き換えることだけです。画像はにあります/usr/site/html/images/p

この状況に取り組むための私のアプローチはどうあるべきですか?ディレクトリに移動して、ディレクトリ内の既存のコードを検索してから、スワップを実行する必要がありますか?

コードが交換されたら、「正常に交換された画像」と言ってhttp://servername/images/p/n/ct/CODE_V1.jpgから、すべてのサーバーのビューを表示して、操作が成功したことを確認できるようにします。

どんな入力でも歓迎します、私はこれを調べています、そして私はすぐにいくつかのコードを貼り付けます。

ありがとう

4

2 に答える 2

1

他の多くの言語も同様であると私は思うので、Perlはこのタスクに非常に適しています。ただし、すでにPerlを知っている場合は、非常に簡単な作業になります。

ディレクトリツリー内の多数のファイルを検索して操作する簡単な方法として、File :: Find::Ruleを見てください。他のすべてをバイパスしながら、特定の要件に一致するファイルのみを含むルールを設定できます。ルールを満たすファイルのハンドラーを設定することもできます。

ハンドラー内で、必要と思われる名前の変更を行うことができます。

ファイルがすべて1つのディレクトリ内にあり、どのファイルが適格であるかを決定する基準(またはルール)のリストが必要ない場合は、-fなどのファイルチェックとともにopendirとreaddirを使用できます。

行き詰まっている場所を示すコードと、コードに関する具体的な質問を投稿すると、実際にはより具体的な支援を受けることができます。あなたの質問は、尋ねられたように、特定の答えを得るには広すぎます。

更新: 昨夜File::Findを見て作業をしました。それは文字通り何千ものディレクトリにある私のWindowsコンピュータ上の約100,000のファイルをトラバースし、約2分かかりました。 sub wanted単純なファイルとディレクトリのカウントを行っただけなので、File::Findの効率のみをテストできました。スクリプトに「開始」を出力させたい最初のコールバック。私がこれを行った理由は、歴史的に、File::Findが大きなファイルシステムを備えたWindowsで実際にコールバックループを開始するのに長い時間がかかることに気付いたためです。

次に、Linuxコンピューターの同じサイズのファイル構造で同じスクリプトを実行しました。

StrawberryPerl5.12.2と$File:: Find :: VERSION of 1.15の下で、以前コメントで話したバグが解消されたように見えることがわかりました。必要なコールバックはほぼすぐに開始されましたが、5.8.xで遊んでいた場合、コールバックは起動するまでに長い時間がかかりました。もちろんこれは窓にあります。Linuxでは、問題は発生しませんでした。

ただし、比較として、Windowsシステムで同様に複雑なディレクトリツリーで動作するFile :: Findテストスクリプトは、「初回実行」時にLinuxシステムで100,000ファイルをトラバースするのに約10倍の時間がかかりました。その後の実行では、Linuxがおそらくファイルシステムのキャッシュを行っていたため、違いはさらに劇的でした。

とにかく、File::FindまたはFile::Find :: Ruleを使用する場合は、File ::とともに最近のPerl(5.12.2または5.14.1)を実行していることを確認することをお勧めします。その最新のPerlに付属しているバージョンを見つけてください。

于 2011-06-29T17:46:06.610 に答える
0
 #!/usr/bin/perl
use strict;
use warnings;
use File::Find;
use Data::Dumper;
use List::MoreUtils qw/ uniq /;

my $localdir = 'images/p/';
my @filefound;

find(
sub {push @filefound, $File::Find::name if /.jpg$/ },
$localdir);

foreach (@filefound){
my @split = split('_',@filefound);
my @split1 = $split[0];
foreach (@split1) { print "$_  \n";} 
}
于 2011-07-18T06:31:47.400 に答える