2012-08-29 43 views
0
06/24/2012 09:58 AM     0 Backup of deleted Report 20120622.xlk 
08/20/2012 06:51 PM   28,160 deleted 9 2 Foundation Installs on March 7th.xls 
08/20/2012 06:51 PM   31,232 deleted-Installations March 10.xls 
08/20/2012 06:51 PM   37,821 deleted Support Process 1.0.pdf 
08/20/2012 06:51 PM   57,344 deleted_Support_Process_3_18_2010 V2.vsd 

嘿傢伙。我正在爲某些文件系統分析編寫一個Perl實用程序。我在Windows中使用DIR來列出某些文件。我想抓取訪問日期(第一列)和文件名(最後一列)。許多文件名都有空格,所以我不能輕鬆地將其分割爲空格。理想情況下,我應該分開列分隔符。窗口中的分隔符

  • 有沒有人知道什麼字符我應該灑在Windows(XP)輸出這樣得到每個單獨的列?
  • 或者如果沒有好的角色可以分割,是否有以Perl爲中心的策略來抓取我需要的兩列?
+0

Perl'stat'函數不能在Windows上運行,與'opendir','readdir','closedir'結合使用。解析DIR命令的輸出與解析Unix上'ls'的輸出相似 - 容易出錯。如果繼續使用DIR,按列號(字符)拆分:1-10是日期,並且名稱從其他位置開始到字符串結尾。 –

回答

4

split函數有一個可選的第三個參數來定義字符串的最大數量,你分成:

my ($date, $time, $ampm, $size, $name) = split /\s+/, $input, 5; 

解析dir輸出是不理智的。您可以在Perl打開一個目錄與opendir功能和環比的條目:

open my $directory, $dirname or die; 
while(defined(my $file = readdir $directory)) { 
    next if -d "$dirname/$file"; # skip directories 
    my $mtime = (stat "$dirname/$file")[9]; # we use the mtime (last modified) 
    printf "%10d %s", $mtime, $string; 
} 

您可以諮詢爲stat功能的進一步選項,包括數組索引訪問時間或文件大小的文檔。時間以Unix時間(自1970年1月1日00:00之後的秒數)給出,但可以使用localtime轉換爲更易讀的格式。

+1

如果你['使用File :: stat;'](http://search.cpan.org/perldoc?File::stat),你可以使用'stat(「$ dirname/$ file」) - > mtime'而不是'(stat(「$ dirname/$ file」))[9]' – ikegami

+0

Perl支持的函數要容易得多,謝謝你的建議。 – gbtimmon

4

存在一個純粹的Perl解決方案。 stat函數可用於獲取訪問時間。

否則,你可能分裂的空白:

#!/usr/bin/env perl 

use strict; 
use warnings; 

while (<DATA>) { 
    chomp; 
    my ($date, undef, undef, undef, $name) = split " ", $_, 5; 
    print "$date: $name\n"; 
} 

__DATA__ 
06/24/2012 09:58 AM     0 Backup of deleted Report 20120622.xlk 
08/20/2012 06:51 PM   28,160 deleted 9 2 Foundation Installs on March 7th.xls 
08/20/2012 06:51 PM   31,232 deleted-Installations March 10.xls 
08/20/2012 06:51 PM   37,821 deleted Support Process 1.0.pdf 
08/20/2012 06:51 PM   57,344 deleted_Support_Process_3_18_2010 V2.vsd 

你可以使用unpack消費數據逐列

while (<DATA>) { 
    chomp; 
    my ($date, $filename) = unpack 'A10 x29 A*'; 
    print "$date: $filename\n"; 
} 
+0

這將分割文件名,這可能會使事情變得困難,我真的應該能夠以某種方式傳播列。 – gbtimmon

+2

你可以避免(可能斷開)連接,只需使用'my($ date,$ time,$ m,$ size,$ filename)= split「」,$ _,5;' – hobbs

+2

另外,你是對的你應該能夠使用readdir和stat而不是將其轉換爲dir。如果你不把它寫成一個完整的答案,我會:) – hobbs