如何在子文件夹中调用脚本

时间:2010-09-07 17:42:09

标签: perl email scripting

我有一个脚本,我用它来删除重复的日历条目。根邮件文件夹包含每个文件夹为firstname_lastname的文件夹,然后在/ Calendar / #msgs /之下。

截至目前,我正在通过转到用户文件夹并启动脚本/Users/Documents/duplicates/dups.pl来手动运行脚本。 --killdups`

有没有办法让我可以轻松地遍历所有用户邮件文件夹并查看相应的/ Calendar / #msgs /文件夹并运行脚本?

3 个答案:

答案 0 :(得分:1)

根据你想做的事情,有几种方法可以解决这个问题。

首先,您可以让脚本搜索其起始目录下的每个文件夹。您没有在命令行上指定任何内容。

 use File::Spec::Functions qw(catfile);

 my @users = glob( '/Users/*' );
 foreach my $user ( @users ) {   # $user looks like /Users/Buster
      my $calendar_dir = catfile( $user, 'Calendar', '#msgs' );
      ...
      }

您还可以使用opendir获取用户列表,以便一次返回一个目录:

 opendir my $dh, '/Users' or die ...;
 while( my $user = readdir $dh ) {
     next if $user =~ /^\.\.?\z/; # and anything else you want to skip
     ... # do the cool stuff
     }

其次,您可以搜索所选文件夹。假设您在主目录中。要杀死特定用户的重复项,您可以使用这些用户名称调用脚本:

 dups.pl --killdups Buster Mimi Roscoe 

通过所有用户,可能是这样的(它几乎看起来像你在MacOS X上,但不完全,所以我不确定你需要哪个路径),使用命令行glob:

 dups.pl --killdups /Users/*

解决方案看起来很相似,但您从@ARGV获取用户而不是使用glob:

 foreach my $user ( @ARGV ) {
      ...
      }

这应该足以让你入门。您必须将其与脚本的其余部分集成,并在每种情况下修复路径以满足您的需要,但这只是简单的字符串操作(甚至比File::Spec更简单。

答案 1 :(得分:0)

传入应在命令行上查看的文件夹。参数将在@ARGV中,您只需循环它。

答案 2 :(得分:0)

编辑:也许您更喜欢优雅的Perl解决方案?

#!/usr/bin/perl -w
# CC-by Cedric 'levif' Le Dillau.

use File::Find;

@ARGV = qw(.) unless @ARGV;
find sub { apply_to_folder($File::Find::name) if -d }, @ARGV;

sub apply_to_folder {
    my $folder = shift;
    printf "folder: %s\n", $folder;
}

然后,您的 apply_to_folder()功能可以是您想要的任何内容。

请注意,将-d替换为-f-f && -x可以更改过滤功能。 (可以使用perldoc -f -X

找到帮助

旧命题是:

尝试使用:

$ find "/Calendar/#msgs/" -type d -exec dups.pl "{}" --killdups \;

或perl的opendir() / readdir()函数:

$ perldoc -f opendir