需要帮助删除给定目录中超过30天的文件夹,但不包括文本文件或用户指定的文件夹(可能超过30天,但我们不应删除)
set DIRPATH=%1
set MAXDAYS=30
forfiles -p %DIRPATH% -m *.* -d -%MAXDAYS% -c "cmd /c del /q @path"
forfiles -p %DIRPATH% -d -%MAXDAYS% -c "cmd /c IF @isdir == TRUE rd /S /Q @path"
此代码会删除超过30天的所有文件夹。我想排除一些目录。我该如何做到这一点?
答案 0 :(得分:0)
如果我理解的是正确的,你应该这样做:
使用目录名读取文件并将其存储到数据结构中(在我的例子中是哈希)。
阅读目录并从那里过滤掉文件夹。
总体来说,这可以在Perl脚本中总结如下:
警告:在测试过程中发表评论rmdir $folder;
,以避免意外数据丢失。
#!/usr/bin/perl
use strict;
use warnings;
use File::stat;
use Time::Piece;
#pass your file containing directory-name through command-line
my $file_with_dir=$ARGV[0];
my %dirs;
#open your file to check directories which shouldn't be removed
open my $fh, '<', $file_with_dir or die "unable to open file $file_with_dir: $!\n";
while(<$fh>){
chomp;
$dirs{$_}=1;
}
close($fh);
#read the folders from directory
my $dir=<your folder name here>;
opendir(my $dh,$dir) or die "unable to open DIR $dir: $!\n";
my @folders=grep{ !/^\./ && -d $_} readdir $dh;
closedir($dh);
#get today's date and time
my $curr_time=localtime;
foreach my $folder( @folders )
{
next if $dirs{$folder}; #skip if folder-name is in file you provided
my $stat=stat($folder);
my $creation_time=localtime($stat->ctime) if($stat);
#calculate difference in days
my $diff_days=int(($curr_time-$creation_time)->days);
if($diff_days > 30){
print "$folder is more than $diff_days days old deleting...\n";
#delete the folder use with caution comment it when you are testing
rmdir $folder or warn "unable to remove dir $folder: $!\n";
}
}
<强>更新强>
grep
通常用于过滤掉列表中的元素。我正在过滤掉满足两个标准的元素
!/^\./
这意味着列表中的任何元素都不应该以{{1}}开头,因为目录可能包含.
和.
。-d
用于检查项目是否为目录(在您的情况下是文件夹)。