使用PHP递归列出所有带日期的文件

时间:2015-08-08 08:09:40

标签: php date recursion

在有人标记此副本之前,请了解我搜索了此网站,Google搜索和PHP.net。

我想要的是超级简单。我想要一个带有日期戳(最后修改)的网站上所有文件的列表。我发现有几个声称可以执行此操作的脚本,但它们都没有工作。

到目前为止,我发现的最好的是这一个:

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纳入第一个脚本吗?

3 个答案:

答案 0 :(得分:1)

这是我发现效果很好的一些代码

$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/>";
}

答案 1 :(得分: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. 上次修改的日期时间
  4. 它进行了一些额外的检查,以确保可以读取提供的$path

    您现在在数组中有$files的结果集,您应该能够重用第一个示例中的某些代码作为.csv文件输出。

    希望这会有所帮助:)

答案 2 :(得分:1)

如果有人好奇,这就是我最终的结果。它将第一个答案的简单性和有效性与我问题中第一个例子的csv结合起来。当我在excel中打开csv文件时,我可以轻松地按日排序。

我需要这个的原因是为了帮助追踪我的某个网站上的一些恶意软件。通过列出所有文件,我可以按日期排序并查找在可疑日期添加的文件。或者相反,如果我在某一天发现了已知威胁,我可以很容易地看到当天/时间修改了哪些其他文件。它帮助我极大地消除了我的网站持续感染。它不断恢复生机,因为我无法删除所有文件。使用这个简单的脚本,我终于找到了已经安装的后门shell。呼!

非常感谢两位回答者! :)

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