2015-08-08 48 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"; 
} 
?> 
相关问题