Perl子目录遍历

时间:2012-05-15 19:45:50

标签: perl directory traversal

我正在编写一个脚本,该脚本遍历我们的Perl Scripts大目录并检查某些内容。现在,它需要两种输入:主目录或单个文件。如果提供单个文件,它将在该文件上运行main函数。如果提供了主目录,它会在该目录中的每个.pm和.pl上运行main函数(由于目录遍历的递归性质)。

我如何编写它(或者什么包可能有用) - 这样我也可以输入七个SUBdirectories中的一个,它只会遍历那个子目录(而不是整个东西)?

3 个答案:

答案 0 :(得分:2)

我无法真正看到两个目录参数之间的处理差异。当然,使用File :: Find只会在两个实例中做正确的事情。

像这样......

#!/usr/bin/perl

use strict;
use warnings;

use File::Find;

my $input = shift;

if (-f $input) {
  # Handle a single file
  handle_a_file($input);
} else {
  # Handler a directory
  handle_a_directory($input);
}

sub handle_a_file {
  my $file = shift;

  # Do whatever you need to with a single file
}

sub handle_a_directory {
  my $dir = shift;

  find(\&do this, $dir);
}

sub do_this {
  return unless -f;
  return unless /\.p[ml]$/;

  handle_a_file($File::Find::name);
}

答案 1 :(得分:1)

如果您确切知道要查看的目录和子目录,可以使用glob("$dir/*/*/*.txt")来获取给定.txt的第3级中的$dir个文件

答案 2 :(得分:1)

一种方便的方法是使用优秀的Path::Class module,更精确地使用Path::Class::Dirtraverse()方法。您将在回调函数中控制要处理的内容,该函数作为traverse()的第一个参数提供。联机帮助页有样本片段。

当然,使用像opendir这样的内置函数非常好。

我刚刚转向使用Path::Class几乎无处不在,因为它有很多不错的便利方法,而且感觉很对。请务必阅读docs for Path::Class::File以了解可用的内容。 99%的时间都可以胜任这项工作。