find関数が1階層(カレントディレクトリ)にしか利きません。
Active Perl+MS-DOS(WindowsXP)の環境です。
深い階層を持つディレクトリAで
find(\&dirfiletotal,'.');
を実行し、特定のファイル名を検出しています。
なぜかカレントディレクトリ(A)にあるファイルに対してしか動作しません。(結果は正常です。)
find関数は再帰的、つまり下の階層も含めてファイル検出するのだと思っていましたが、間違いでしょうか?
もし間違いであれば、どのように書き変えればいいか、ヒントをいただけると大変助かります。
どうぞ宜しくお願い致します。
No.1
- 回答日時:
File::Findのfindですね。
再帰的にファイル階層を辿りますよ。Active Perl は使ったことないですが、フォルダ名が日本語とかダメなんですかね。もしそうでしたら、英数字のみのフォルダとファイル名で試したらでどうでしょうか?あとは自分で作ってみるとか。(以下、空白を全角にしていることに注意)
use File::Spec;
use File::Basename;
my $dir = shift || '.';
my @files = find_files($dir);
print $_, $/ for @files;
sub find_files {
my ($dir) = @_;
my $base_name = fileparse($dir);
my @files = ();
# skip .. ... etc
if ( $base_name =~ /^\.\.+$/ ) {
return ();
}
opendir my $dh, $dir or die "$!:$dir";
EACH_FILES:
for ( readdir $dh ) {
# skip . .. ... etc
next EACH_FILES;
if $_ =~ /^\.+$/;
my $file = File::Spec->catfile( $dir, $_ );
if ( -d $file ) {
push @files, find_files($file);
}
else {
push @files, $file;
}
}
closedir $dh or die "$!:$dir";
return @files;
}
No.2ベストアンサー
- 回答日時:
訂正
next EACH_FILES;
if $_ =~ /^\.+$/;
↓
next EACH_FILES if $_ =~ /^\.+$/;
_--_1l1_1_様、
懇切丁寧に教えてくださいまして、本当にありがとうございました。
日本語ではNGかも、というポイントは目からウロコでした。
言われてみれば、でやっと思い当たりました。
今後こういうことが起こった時には、まずそれを検証してみます。
いただいたスクリプトのお手本を参考に、勉強しながらさっそく使わせていただきます。
本当にありがとうございます。
大変助かりました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) 図に示す階層構造で,現在のディレクトリ(カレントディレクトリという)が*印のディレクトリであるとき, 2 2022/11/16 10:55
- Visual Basic(VBA) エクセルの数式で教えてください。 1 2023/07/31 15:49
- その他(開発・運用・管理) フォルダの中にファルダを作成してファイルを格納するバッチコマンド 1 2022/06/30 11:39
- Excel(エクセル) ExcelのFIND関数について 4 2023/06/06 18:10
- Excel(エクセル) スプレットシートの関数 3 2023/04/07 11:49
- UNIX・Linux Linuxについて質問です。 以下のhistoryの出力結果から、sedコマンドのファイル名tmp1 1 2023/02/03 20:11
- Excel(エクセル) Excelマクロの表示のExcel内をfindで検索 3 2022/06/15 20:07
- Visual Basic(VBA) batにて、異なるフォルダの同名ファイルを参照し、文字列を判別。擬似配列で変数へ格納 3 2022/04/10 03:37
- Excel(エクセル) 特定の文字の合計値(空白を無視+可変に対応)を求める関数について 1 2022/08/18 10:51
- Visual Basic(VBA) 複数ファイルのデータの統合について 12 2022/05/14 12:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
batファイルでrenameができませ...
-
vba dir の相対パス
-
dos変数の%~dp0は powershellで...
-
Perlスクリプトでフォルダを開...
-
readdir()で得られるファイル・...
-
複数ファイルの読み込みについて
-
chdirがうまくできない
-
Windowsで複数のファイルを同じ...
-
VBAでCSVファイルを途中行まで...
-
バッチファイルの作り方(CSV→...
-
close()で例外が投げられる理由
-
VBAでCSVファイルの特定行を書...
-
openした後、closeしないでプロ...
-
VBAコードを張り付け後のエクセ...
-
ListBoxのデータを高速でファイ...
-
JavaでCSVファイルを高速に読む...
-
至急お願いします。C言語で.img...
-
タブの色を変更する方法
-
while(<ハンドラ>) {} で行数を...
-
RSS自動生成で文字化け
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
batファイルでrenameができませ...
-
FindFirstFileとFindNextFileで...
-
ディレクトリの判別
-
Windowsで複数のファイルを同じ...
-
vba dir の相対パス
-
パスから最後のディレクトリだ...
-
chdirがうまくできない
-
テキストファイルの結合
-
dos変数の%~dp0は powershellで...
-
Perlで フォルダ内の全て...
-
readdir()で得られるファイル・...
-
makefileでファイルをコピー(...
-
C言語でファイル名を取得
-
サーバーにある特定の拡張子フ...
-
ディレクトリツリーの表示
-
ファイル名と更新日付の取得に...
-
Director拡張子
-
LinuxのC言語で、ファイル名の...
-
複数ファイルの読み込みについて
-
ディレクトリ名を取得したい
おすすめ情報