11

ワイルドカードを使用したパスが指定されたファイル名のリストを取得しようとしています。

my $path = "/foo/bar/*/*.txt";
my @file_list = glob($path);
foreach $current_file (@file_list) {
   print "\n- $current_file";
}

ほとんどの場合、これは完全に機能しますが、/foo/bar/* サブパスのどこかに 2GB を超えるファイルがある場合、glob はエラーや警告なしで空の配列を返します。

ファイル file を削除するか、次のような文字/ブラケット シーケンスを追加すると:

my $path = "/foo/bar/*[0-9]/*.txt";

また

my $path = "/foo/bar/*1/*.txt";

その後、グロブは再び機能します。

アップデート:

例を次に示します (ビジネス ポリシーの問題で、パス名をマスクする必要がありました)。

[root]/foo/bar # ls -lrt
drwxr-xr-x    2 root     system         256 Oct 11 2006  lost+found
drwxr-xr-x    2 root     system         256 Dec 27 2007  abc***
drwxr-xr-x    2 root     system         256 Nov 12 15:32 cde***
-rw-r--r--    1 root     system  2734193149 Nov 15 05:07 archive1.tar.gz
-rw-r--r--    1 root     system     6913743 Nov 16 05:05 archive2.tar.gz
drwxr-xr-x    2 root     system         256 Nov 16 10:00 fgh***
[root]/foo/bar # /home/user/test.pl
[root]/foo/bar #

>2GB ファイルの削除 (または "/foo/bar/ / " の代わりに "/foo /bar/[acf] / " でグロビング)

[root]/foo/bar # ls -lrt
drwxr-xr-x    2 root     system         256 Oct 11 2006  lost+found
drwxr-xr-x    2 root     system         256 Dec 27 2007  abc***
drwxr-xr-x    2 root     system         256 Nov 12 15:32 cde***
-rw-r--r--    1 root     system     6913743 Nov 16 05:05 archive2.tar.gz
drwxr-xr-x    2 root     system         256 Nov 16 10:00 fgh***

[root]/foo/bar # /home/user/test.pl
- /foo/bar/abc***/heapdump.phd.gz
- /foo/bar/cde***/javacore.txt.gz
- /foo/bar/fgh***/stuff.txt
[root]/foo/bar #

なにか提案を?

Perl 5.8.8 Aix 5.3 ファイルシステムはローカル jfs です。

4

2 に答える 2

4

適切な回答がない場合は、回避策が必要になります。5.8.8 の glob() 実装でプラットフォーム固有のバグに遭遇したと思います

私は CPAN のソースをざっと見ましたが、私の C はさびすぎて有用なものを見つけることができませんでした。

ただし、そのモジュールには多くの変更が加えられているため、バグが報告されて修正されている可能性があります。5.8 の最後のリリースではありません。AIX 互換性と File::Glob の更新について言及している 5.8.9 があります。

local::libをまだインストールしていない場合はインストールしてから、おそらくcpanmをインストールして、File::Glob を更新してみてください。ここから手動でファイルをダウンロードする必要があるかもしれません

これで問題が解決した場合は、必要なシステムに更新を展開するか、必要な glob() の一部を再実装する必要があります。これは、パターンがどれほど複雑になるかによって異なります。

問題が解決しない場合は、少なくともいくつかの printf をコードに挿入して、その動作を確認できます。

うまくいけば、誰かが実際の回答を投稿し、「回答を投稿」をクリックしてから約 5 分後にこれを冗長にしてくれることを願っています。

于 2012-11-16T17:12:29.887 に答える
-3

私は以前に新しい Glob 関数を使用したことがないので、利点/問題についてコメントすることはできませんが、かなり多くの人がそれを使用して問題を抱えているようです: => https://stackoverflow.com/search?q=perlを参照してください。 +glob&submit=いくつかの質問と考えられる解決策を検索します。

他の何かを試しても構わない場合: これは、私が数え切れないほどのプロジェクトで使用してきた、試行錯誤した「古い学校」の perl ソリューションです。

my $path = "/foo/bar/";
my @result_array = qx(find $path -iname '*.txt'); #run the system find command

なんらかの理由でスクリプト内からシステム コマンドを実行したくない場合は、代わりに組み込みの Find::Perl モジュールを検索してください: http://search.cpan.org/~dom/perl-5.12.5/lib /ファイル/Find.pm

幸運を

于 2012-11-16T14:00:11.590 に答える