2015-11-05 96 views
0

需要幫助刪除給定目錄中超過30天的文件夾,但不是文本文件或用戶指定的文件夾(可能超過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天以前的任何文件夾。我想排除一些目錄。我如何實現這一目標?

+2

這不是Perl代碼。 – serenesat

+0

'FORFILES/S/D -30/C「cmd/c IF @isdir == TRUE rd/S/Q @path」' –

+0

你好serenesat,你可以在perl下試試,但我已經在bat中試過了 – tilakraj

回答

0

如果不管我的理解是正確的,你應該這樣進行:

  1. 閱讀與目錄名文件,並存儲到數據結構(在我的情況下,哈希值)。

  2. 閱讀目錄並從那裏過濾出文件夾。

  3. 迭代目錄並跳過文本文件中的文件夾並刪除超過30天的其他文件夾。

總體而言,這可以歸納爲如下Perl腳本:

注意:測試保存自己從unintensional數據丟失時評論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. !/^\./這意味着名單不應該與.開始的任何元素,如目錄可能包含...的元素。
  2. -d用於檢查項目是否是目錄(在你的情況下它是文件夾)。
+0

嗨Arunesh Singh,似乎沒關係,你能解釋我這一行my @ folders = grep {!/^\ ./ && -d $ _} readdir $ dh; closedir($ DH); – tilakraj

+0

檢查更新並將其重新標記爲'perl',如果這對你有用。 –

+0

代碼正在執行,但它不刪除舊的元素,而不是我的$ dir = <您的文件夾名稱在這裏>;我給了我這樣的$ dir =「D:/ SDI/TestResults/mainline/mainline」;即使單引號也不起作用 – tilakraj

相關問題