簡體   English   中英

如何在Perl中獲取最后更改的目錄?

[英]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個子目錄可能效率非常低。

  1. 你如何只獲得由八位數組成的目錄名?

     use File::Slurp; my @dirs = grep { -d and /\\A[0-9]{8}\\z/ } read_dir $top; 
  2. 你如何獲得最大的?

     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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM