2015-08-08 46 views
3

在有人標記此重複內容之前,請理解我搜索了此網站,Google搜索和PHP.net。用PHP遞歸列出所有帶日期的文件

我想要的是超級簡單。我想要一個帶有日期戳(最後修改)的網站上的所有文件的列表。我發現了幾個聲稱可以這樣做的腳本,但是他們都沒有工作。

到目前爲止,我已經找到了最好的一個是這樣的一個:

header("Pragma: public"); 
    header("Cache-Control: private"); 
    header("Content-Type: text/csv"); 
    header("Content-Disposition: attachment; filename=age-of-files.csv"); 

    $result = array(); 
    $handle = opendir("."); 
    while ($datei = readdir($handle)) 
    { 
      if (($datei != '.') && ($datei != '..')) 
      { 
       $file = "./".$datei; 
       if (!is_dir($file)) 
        $result[] = $file; 
      } 
    } 
    closedir($handle); 
    foreach($result as $r) 
    if (file_exists($r)) 
     echo substr($r,2).",".date ("m-d-Y", filemtime($r))."\r\n"; 

這對於腳本運行在dircetory的偉大工程,但它不是遞歸的。我需要它繼續爲每個子目錄。我的目標是擁有一個可排序的列表,以便我可以找到在特定日期或周圍修改過的文件。

我是PHP新手,請耐心等待。我在PHP.net做了一些研究(我一直在看人們提到SPL,我不確定它代表什麼或它是什麼,但也許它是一組標準的PHP類),看起來我需要以某種方式使用RecursiveDirectoryIterator。

我發現這個腳本在紙上看起來不錯,但在我的網站上運行它會產生空白的白色屏幕。

try 
{ 
     /*** freds home directory ***/ 
     $rdi = new recursiveDirectoryIterator('/', FilesystemIterator::SKIP_DOTS | FilesystemIterator::UNIX_PATHS); 
     $it = new recursiveIteratorIterator($rdi); 
     while($it->valid()) 
     { 
       if(!$it->isDir()) 
       { 
         echo $it->current().' '.date('Y m d H:i:s', $it->getATime())."\n"; 
       } 

       /*** move to the next element ***/ 
       $it->next(); 
     } 
} 
catch(Exception $e) 
{ 
     /*** echo the error message ***/ 
     echo $e->getMessage(); 
} 

我寧願因爲我喜歡它創建一個CSV文件(容易排序),但我不知道如何協調二者使用的第一個腳本。有人能告訴我如何將RDI合併到第一個腳本中嗎?

+0

嘗試不使用這些',FilesystemIterator :: SKIP_DOTS | FilesystemIterator :: UNIX_PATHS' – Sayed

回答

0

這裏是一個小的代碼,我發現工作得很好

$rdi = new RecursiveDirectoryIterator("path/"); // The directory here 
$rii = new RecursiveIteratorIterator($rdi); 

foreach ($rii as $filename=>$cur) { 
    echo $cur.' '.date('Y m d H:i:s', $cur->getATime())."<br/>"; 
} 
+0

如果我用「。」替換「path /」,這個工作很好。 – UserX

1

嘗試這樣的事情,這是類似的,你所提供的第二個例子:

<?php 

$path = __DIR__; 

if (!is_dir($path)) { 
    throw new RuntimeException(sprintf('Path %s does not exist!', $path)); 
} 

if (!is_readable($path)) { 
    throw new RuntimeException(sprintf('Path %s is not readable!', $path)); 
} 

$iterator = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($path) 
); 

$files = []; 

foreach ($iterator as $fileInfo) { 
    if ($fileInfo->isFile()) { 
     $files[] = [ 
      $fileInfo->getFilename(), 
      dirname($fileInfo->getPathname()), 
      date('c', $fileInfo->getMTime()) 
     ]; 
    } 
} 

print_r($files); 

給出的例子文件結構:

enter image description here

這產生了:

Array 
(
    [0] => Array 
     (
      [0] => .DS_Store 
      [1] => /private/tmp/rec 
      [2] => 2015-08-08T08:28:33+00:00 
     ) 

    [1] => Array 
     (
      [0] => .DS_Store 
      [1] => /private/tmp/rec/0 
      [2] => 2015-08-08T08:28:33+00:00 
     ) 

    [2] => Array 
     (
      [0] => 0.1.txt 
      [1] => /private/tmp/rec/0/0.1 
      [2] => 2015-08-08T08:27:58+00:00 
     ) 

    [3] => Array 
     (
      [0] => 0.txt 
      [1] => /private/tmp/rec/0 
      [2] => 2015-08-08T08:27:58+00:00 
     ) 

    [4] => Array 
     (
      [0] => .DS_Store 
      [1] => /private/tmp/rec/1 
      [2] => 2015-08-08T08:28:33+00:00 
     ) 

    [5] => Array 
     (
      [0] => .DS_Store 
      [1] => /private/tmp/rec/1/1.1 
      [2] => 2015-08-08T08:28:27+00:00 
     ) 

    [6] => Array 
     (
      [0] => 1.1.txt 
      [1] => /private/tmp/rec/1/1.1 
      [2] => 2015-08-08T08:27:58+00:00 
     ) 

    [7] => Array 
     (
      [0] => 1.txt 
      [1] => /private/tmp/rec/1 
      [2] => 2015-08-08T08:27:58+00:00 
     ) 

    [8] => Array 
     (
      [0] => rec.php 
      [1] => /private/tmp/rec 
      [2] => 2015-08-08T08:48:30+00:00 
     ) 

) 

每個匹配被存儲爲包含子陣列元件:

  1. 文件名
  2. 電流dirpath
  3. 日期時間上次修改的

它使一些額外的檢查,以確保提供的$path可以被讀取。

您現在在數組中有一個$files的結果集,您應該可以重用第一個示例中的一些代碼以輸出爲.csv文件。

希望這有助於:)

+0

謝謝!我會玩弄這個,看看我是否可以將它納入我發佈的第一個例子,因爲我認爲這將是一個更有說服力的解決方案。 – UserX

+0

沒問題。我昨天正在衝出門,所以我沒有時間用.csv導出完成答案。而且......我現在再次衝出去了:)但我會盡力在相應的時候更新答案,而不是在主循環中創建一個數組,最好直接用' fputcsv()'等 –

1

如果有人好奇,這是我結束了。它將第一個答案的簡單性和有效性與我的問題中第一個例子的csv相結合。當我在Excel中打開csv文件時,我可以輕鬆地進行排序。

我需要這個的原因是幫助追蹤我的某個網站上的一些惡意軟件。通過列出所有文件,我可以按日期排序並查找在可疑日期添加的文件。或者相反,如果我在某一天發現了一個已知的威脅,我可以很容易地看到當天哪些其他文件被修改。它極大地幫助我最終消除了持續感染的網站。它不斷復活,因爲我無法刪除所有文件。使用這個簡單的腳本,我終於找到了已經安裝的後門外殼。唷!

非常感謝兩位回答者! :)

<?php 
header("Pragma: public"); 
header("Cache-Control: private"); 
header("Content-Type: text/csv"); 
header("Content-Disposition: attachment; filename=age-of-files.csv"); 

$rdi = new RecursiveDirectoryIterator("."); // The directory here 
$rii = new RecursiveIteratorIterator($rdi); 

foreach ($rii as $filename=>$cur) { 
    echo $cur.', '.date('m-d-Y', $cur->getATime()).', '.date('H:i:s', $cur->getATime())."\r\n"; 
} 
?> 
相關問題