我有一个脚本,我用它来删除重复的日历条目。根邮件文件夹包含每个文件夹为firstname_lastname的文件夹,然后在/ Calendar / #msgs /之下。
截至目前,我正在通过转到用户文件夹并启动脚本/Users/Documents/duplicates/dups.pl来手动运行脚本。 --killdups`
有没有办法让我可以轻松地遍历所有用户邮件文件夹并查看相应的/ Calendar / #msgs /文件夹并运行脚本?
答案 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