[英]How can I get the last modified time of a directory in Perl on Windows?
[英]How can I get the last changed directory in Perl?
Apache 2.2.11版(Unix)體系結構x86_64操作系統Linux內核版本2.6.18-164.el5
好的,這就是我的工作。 但是,我可能沒有在其余的腳本中使用File::Util
。
我的目錄名是8位數,起始於10000000。 我將最高找到的數字與stat last created
作為雙重檢查進行比較但是,我相信過度殺傷力。
另一個問題是我不知道如何在list_dir
命令中使用正則表達式,因此只有8位數字,例如m!^([0-9]{8})\\z!x)
可以駐留在該字符串中。 讀這個男人,這個例子讀起來'--pattern=\\.txt$')
但是,我的徒勞嘗試: '--pattern=m!^([0-9]{8})\\z!x)')
好吧,就是這樣。
那么,有沒有“更好”的方法來獲取最新的文件夾/目錄?
use File::Util;
my($f) = File::Util->new();
my(@dirs) = $f->list_dir('/home/accountname/public_html/topdir','--no-fsdots');
my @last = (sort { $b <=> $a } @dirs);
my $new = ($last[0]+1);
print "Content-type: text/html\n\n";
print "I will now create dir $new\n";
並且..我怎么會忽略任何與我的正則表達不匹配的東西?
我認為答案也可能存在於ls -d
,但作為初學者,我不熟悉來自腳本的系統調用(如果事實上那將是什么?;-))。
更具體地說:打開目錄的最佳方式是,返回該目錄中最新8位數目錄的名稱,忽略其他所有目錄。 將8位數的目錄名稱增加1並創建新目錄。 最有效的: stat
或實際的8位數文件名。 (目錄名稱無論哪種方式都是8位數。)最好使用File::Util
或只是內置Perl調用?
你在做什么? 這聽起來很奇怪,充滿了危險。 我當然不希望讓CGI腳本創建新目錄。 對於您想要實現的目標,可能有更好的解決方案。
你期望有多少個目錄? 您在任何目錄中擁有的條目越多,獲得的速度就越慢。 你應該制定一個方案,你可以將一些東西散列到一個擴展文件的目錄結構中,這樣就沒有目錄可以容納那么多項。 比如,你有了名字'0123456789',你創建了如下目錄結構:
0/01/0123456789
您可以擁有任意數量的目錄級別。 例如,請參閱CPAN的目錄結構。 我的作者姓名是BDFOY,所以我的作者目錄是authors / id / B / BD / BDFOY。 這樣就沒有任何目錄具有大量條目(除非您的作者ID是ADAMK或RJBS)。
您還有一個潛在的爭用問題需要解決。 在您發現最新的時間和嘗試創建下一個的時間之間,您可能已經創建了目錄。
至於手頭的任務,如果你要擁有一百萬個目錄,我想我會為這個system
而努力。 有類似的東西:
ls -t -d -1 [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] | head -1
對於這項任務,我認為你不會比ls
更快。 如果有大量目錄,那么你需要做的工作就要超過分叉的成本來自己完成所有事情。
但是,我懷疑你真正需要的是某種數據庫。
打開目錄的最佳方法,返回該目錄中最新的8位數目錄的名稱,忽略其他所有目錄。 將8位數的目錄名稱增加1並創建新目錄。 哪個最有效:統計或實際的8位數文件名?
首先,我應該指出,在目錄中擁有大約100,000,000個子目錄可能效率非常低。
你如何只獲得由八位數組成的目錄名?
use File::Slurp; my @dirs = grep { -d and /\\A[0-9]{8}\\z/ } read_dir $top;
你如何獲得最大的?
use List::Util qw( max ); my $latest = max @dirs;
現在,問題是,在確定$latest
和嘗試創建目錄之間,其他一些進程可以創建相同的目錄。 所以,我會使用$latest
作為起點,並繼續嘗試創建下一個目錄,直到我成功或用完數字。
#/usr/bin/perl
use strict;
use warnings;
use File::Slurp;
use File::Spec::Functions qw( catfile );
use List::Util qw( max );
sub make_numbered_dir {
my $max = 100_000_000;
my $top = '/home/accountname/public_html/topdir';
my $latest = max grep { /\A[0-9]{8}\z/ } read_dir $top;
while ( ++$latest < $max ) {
mkdir catfile($top, sprintf '%8.8d', $latest)
and return 1;
}
return;
}
如果你按照我最初推薦的方式嘗試這樣做,你將會多次調用mkdir
。
至於如何使用File::Util::list_dir
過濾條目:
#/usr/bin/perl
use strict;
use warnings;
use File::Util;
my $fu = File::Util->new;
print "$_\n" for $fu->list_dir('.',
'--no-fsdots',
'--pattern=\A[0-9]{8}\z'
);
C:\Temp> ks 10001010 12345678
但是,我必須指出,在我花費的幾分鍾內,我不太喜歡這個模塊,特別是模塊作者對在列表上下文中調用方法和函數的痴迷。 我不認為我會再次使用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.