2016-06-08 59 views
0

我目前正試圖刪除目錄中超過90天的所有文件。我能想到的唯一解決方案是比我認爲必要的更多的工作。有沒有一個快速簡單的方法來做到這一點?如果您使用此代碼:在Perl中刪除超過90天的文件

my $date=POSIX::strftime('%b%Y', localtime); 
my $logDir = "/test/dir/" 
my $dateDir = "$logDir/$date 
#this directory contains files with the form of someName.date 
+0

http://stackoverflow.com/q/17978927/936986 –

回答

1

下面是使用File::Find::Rule的方式,因爲它保持完整的路徑信息。比較的重要部分是-M $file > 90-M返回自上次修改文件以來的天數。

use warnings; 
use strict; 

use File::Find::Rule; 

my $dir = '.'; 
my $days = 90; 

my @files = File::Find::Rule->file() 
          ->maxdepth(1) 
          ->in($dir); 

for my $file (@files){ 
    if (-M $file > 90){ 
     print "deleting $file\n"; 
     unlink $file or warn $!; 
    } 
} 

請注意maxdepth()方法說「不要遍歷子目錄」。如果您想查看子視窗,請將其設置爲0

另外,如果要指定一個特定的名稱,你可以添加一個name()方法,這將需要正則表達式,只有對這些文件進行操作。例如:name('*.2016*')

+1

這正是我所期待的。謝謝 – cvirus96

1

您可以使用-M文件測試以天爲單位獲取文件的年齡。 From -X

-M腳本開始時間減去文件修改時間,以天爲單位。

剩下的就是有關獲取文件的列表。這裏我使用opendirreaddir

use 5.012; # so readdir assigns to $_ in a lone while test 
opendir(my $dh, $dateDir) or die "Can't open $dateDir directory: $!"; 
while (readdir($dh)) { 
    my $file = "dateDir/$_"; 
    if (-f $file and -M $file > 90) { 
     unlink $file or warn "Can't unlink $file: $!"; 
    } 
} 

以上是需要的路徑除了因爲readdir返回一個裸露的文件名,而沒有任何路徑。在實際刪除之前,您可以包含各種測試。 (並請始終測試代碼第一

在版本對Perl 5.12之前的裸readdir沒有設置$_,這是上面的use 5.012左右。對於這些版本中,我們需要做的

opendir(my $dh, $dateDir) or die "Can't open $dateDir directory: $!"; 
while (my $file_nopath = readdir($dh)) { 
    my $file = "$dateDir/$file_nopath"; 
    # same as above 
} 

我們可以在同一行讀取目錄(如果它不是太大),如果我們寧願有第一

所有文件的列表
my @filenames_relative = readdir($dh); 

這是因爲什麼readdir回報是基於這就是所謂的上下文。因爲它的輸出在這裏被分配到一個數組,因此它被稱爲在列表環境,它返回目錄中的所有條目列表。

由於文件名都是相對於該目錄中我們可以map它們變成完整路徑

my @files = map { "$dateDir/$_" } readdir($dh); 

這裏列表環境map強加給readdir,因爲該功能需要一個列表作爲輸入。

+0

'$ file'將是'$ dateDir'中文件的名稱,但您將它視爲當前目錄中的文件名,工作。要麼將路徑連接在一起,要麼只是使用'glob'。 – hobbs

+0

@hobbs哦,謝謝。更正 – zdim

1

如果我理解你正確,那麼你想刪除目錄/test/dir中90天以前的所有文件。我不明白my $dateDir = "$logDir/$date是,但是這一次的在線解決方案會按照你問

$ perl -e 'unlink grep { -f and -M >= 90 } glob "/test/dir/*"' 
0

這裏是我的功能來查找文件的Perl中年齡:

########################################################################### 
# In: complete path to filename. 
# Out: age in fractional days 
sub getfileage 
{my($fn)[email protected]_; 
my(@a,@b,$i,$j,$procname,$s,$t); 

$procname="util2.pl:getfileage"; 

if (! -e $fn) 
    { 
    print "$procname ERROR: $fn does not exist\n"; 
    exit 1; 
    } 

my $age = -M $fn; # Returns age in days 
$age=sprintf("%.2f",$age); 

return $age; # getfileage 
} 

只要插上在,並通過文件名。 這對其他可能會遇到此問題的用戶也很有用。

相關問題