0

私は perl を学習しようとしていますが、特に File::Find モジュールを使用して画像のディレクトリ ツリーを検索し、既存のファイル名がカメラのファイル名と一致するかどうかを確認しています。ファイル名がそこにある場合、ファイルはこのカメラから既に転送されていると想定し、それ以上処理しません。ファイル名が見つからない場合は、ファイルに対して何らかのアクションを実行したいと思います。

基本的な構造を作成するために find2perl を使用しましたが、ファイルの検索には機能します。しかし、検索が失敗したかどうかを確認する方法が見つからないようです。File::Find::find は、動作する値を返していないようです。動作する方法や、使用している '&wanted' サブディレクトリからの戻り値を使用する方法がわかりません。

File::Find::find が一致するファイルを見つけるのに成功しなかったかどうかを判断する最適な方法は何ですか? プログラムの先頭で特定の値に設定され、検索が成功した場合にのみ変更されるグローバル フラグ変数を使用する必要がありますか? 検索後にその値をチェックして、変更された (成功) かどうか (何も見つからない) を確認できると思います。

アイデアや提案はありますか?

基本的な構造は次のとおりです。

  # Traverse desired filesystems
  File::Find::find({wanted => \&wanted}, '/files/multimedia/pictures/');
  exit;


  sub wanted {
      my ($dev,$ino,$mode,$nlink,$uid,$gid);

     if ( (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) && /^$ARGV[0]\z/si ) {
        print("found: $name\n");
        }
     }
4

1 に答える 1

5

目的のファイルが見つからない場合、wantedサブルーチンは呼び出されません。

私が通常行うことは、まさにあなたが提案したことです-呼び出す前にフラグを false に設定しfindwantedそれを true に設定しました。

それは、実際にその情報を知る必要がある場合です。実際には、かなり長い間、その情報を必要としませんでした。

実際、カウントはより多くの情報を提供するため、フラグよりも優れている場合があります。次のコード:

use File::Find;

sub wanted {
    my ($dev,$ino,$mode,$nlink,$uid,$gid);
    $quant += 1;
    if ( (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) && /^$ARGV[0]\z/si ) {
        print("found: $name\n");
    }
}

$quant = 0;
File::Find::find({wanted => \&wanted}, '/nosuchdir');
print ("Found $quant files in /nosuchdir\n");

$quant = 0;
File::Find::find({wanted => \&wanted}, '/tmp');
print ("Found $quant files in /tmp\n");

私のシステムでは次の出力が生成されます。

Found 0 files in /nosuchdir
Found 39 files in /tmp

そう$countすれば、ゼロはファイルが見つからなかったことを意味し、それ以外はファイルがあったこと示します (また、ファイルの数も示します)。

于 2012-08-21T02:37:40.800 に答える