需要删除超过30天的文件夹但不包括某些文件夹

时间:2015-11-05 06:43:19

标签: perl

需要帮助删除给定目录中超过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天的所有文件夹。我想排除一些目录。我该如何做到这一点?

1 个答案:

答案 0 :(得分:0)

如果我理解的是正确的,你应该这样做:

  1. 使用目录名读取文件并将其存储到数据结构中(在我的例子中是哈希)。

  2. 阅读目录并从那里过滤掉文件夹。

  3. 遍历目录并跳过文本文件中的文件夹,并删除超过30天的其他文件夹。
  4. 总体来说,这可以在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. !/^\./这意味着列表中的任何元素都不应该以{{1​​}}开头,因为目录可能包含..
    2. -d用于检查项目是否为目录(在您的情况下是文件夹)。