2

globを使用してこのリンクを見ました

それは私がやりたいことではありません。

これが私の計画です。ディレクトリを検索して、文字列に部分的に一致するファイルを検索するには、関数にパラメーターとして指定し、/home/username/sampledataその文字列をdata.

サブディレクトリをチェックするかどうかを強制するフラグを実行時に含めるオプションをユーザーに提供します。現在、デフォルトでは、スクリプトにはサブディレクトリが含まれていません。

サブディレクトリを含むものの疑似コードは次のようになります。

ファイルパスを保存している配列はグローバルです

  @fpaths;

  foo($dir);

  sub foo{
      get a tmp array of all files

      for ($i=0 ; $i<@tmp ; $i++) {
          next if ( $tmp[$i]is a hidden file and !$hidden) ; #hidden is a flag too

          if($tmp[$i] is file) {
               push (@fpaths, $dir.$tmp[$i]);
          }
          if($tmp[$i] is dir) {
               foo($dir.$tmp[$i]);
          }

       }
   }

それはかなり堅実に見えます。

私が達成したいと思っているのは、保存された完全なパス名を持つすべてのファイルの配列です。

方法がわからない部分は、すべてのファイルのリストを取得することです。うまくいけば、これは glob で実行できます。

opendir/を使用readdirしてすべてのファイルを読み取ることができましたが、結果がファイルかディレクトリかを確認する方法を知っていれば、これをもう一度行うことができました。

だから私の質問は:

  1. パス名を使用globしてすべてのファイル/サブディレクトリの配列を取得する方法

  2. 以前に見つかった配列の項目がディレクトリかファイルかを確認する方法

みんなありがとう

4

5 に答える 5

3
  • globディレクトリエントリがファイルかディレクトリかを確認する方法の問題を解決する理由がわかりません。以前に使用していた場合はreaddir、そのまま使用してください

  • リンクを慎重に処理する必要があることを忘れないでください。そうしないと、再帰が終わらない可能性があります

  • また、実際のディレクトリの内容だけでreaddirなく...

  • -fノード名がファイルかディレクトリかを確認するにはと-dを使用しますが、その場所が現在の作業ディレクトリでない場合は、パスを追加して完全修飾する必要があることに注意してください。おそらく存在しない別のノード

  • これが学習経験でない限り、次のような準備ができてテスト済みのものを書く方がはるかに優れていますFile::Find

于 2013-05-23T00:35:21.680 に答える
1

この方法を、特定のファイル タイプを分離する再帰的なファイル検索として使用できます。

my @files;
push @files, list_dir($outputDir);

sub list_dir {
        my @dirs = @_;
        my @files;
        find({ wanted => sub { push @files, glob "\"$_/*.txt\"" } , no_chdir => 1 }, @dirs);
        return @files;
}
于 2014-04-25T11:09:57.403 に答える