我正在从http://www.perlmonks.org/index.pl?node_id=217166转换linux脚本,具体如下:
#!/usr/bin/perl -w use strict; use Getopt::Std; use File::Find; @ARGV > 0 and getopts('a:', \my %opt) or die << "USAGE"; # Deletes any old files from the directory tree(s) given and # removes empty directories en passant. usage: $0 [-a maxage] directory [directory ...] -a maximum age in days, default is 120 USAGE my $max_age_days = $opt{a} || 120; find({ wanted => sub { unlink if -f $_ and -M _ > $max_age_days }, postprocess => sub { rmdir $File::Find::dir }, }, @ARGV);
我的尝试是:
#!/usr/bin/perl -w use strict; use Getopt::Std; use File::Find; @ARGV > 0 and getopts('a:', \my %opt) or die << "USAGE"; # Deletes any old files from the directory tree(s) given and # removes empty directories en passant. usage: $0 [-a maxage] directory [directory ...] -a maximum age in days, default is 120 USAGE my $max_age_days = $opt{a} || 120; find({ wanted => sub { unlink if -f $_ and -M _ > $max_age_days }, # postprocess => sub { rmdir $File::Find::dir }, postprocess => sub { my $expr = "$File::Find::dir"; $expr =~ s/\//\\/g; # replace / with \ print "rmdir $expr\n"; `rmdir $expr`; }, }, @ARGV);
但是,当脚本尝试删除一个目录,说明该目录正由另一个进程使用时(当它不是时)时,我收到错误.有任何想法吗?我正在使用ActiveState 5.10在Windows Server 2003 SP2 64位上运行该脚本.
谢谢!
从这份文件
后期过程
该值应该是代码引用.它在离开当前处理的目录之前调用.它在void上下文中调用,没有参数.当前目录的名称位于$ File :: Find :: dir中.此挂钩对于汇总目录(例如计算其磁盘使用情况)非常方便.当follow或follow_fast生效时,后处理是一个无操作.
这意味着当您尝试删除目录时,您自己的代码仍在使用该目录.尝试构建一个名称列表,并在调用find之后迭代它.
另一种可能的解决方案是使用该no_chdir
选项以避免找到使用您要删除的目录.
编辑:此评论也是相关的,所以我将它推广到主答案的正文:
除此之外:这里的问题是在Linux上可以删除正在使用的文件和目录,而在Windows上则不能.这就是为什么它没有修改不起作用的原因.- Leon Timmermans
只需几点说明:
你不需要将/翻到\.Perl知道/是一个目录分隔符,即使在Windows上也是如此.
rmdir是一个内置的Perl,你不需要用反引号来调用它.