如何查找同一父目录中存在的同名重复文件?

如何查找同一父目录中存在的同名重复文件?

我正在清理我的项目。项目中有一些模块正在被重命名、新建或直接复制。在此过程中,我直接复制了重命名的目录或创建了新目录。现在我想删除旧目录文件。所以我想要所有具有相同名称的路径的文件。(计数 > 2)。有 500 多个此类文件。可以是 css、tpl、php 或 js 文件。

IE

  1. 主页/游戏/troy.php
  2. 主页/游戏/儿童游戏/troy.php
  3. 主页/游戏/体育/troy.php

如果在主目录上完成搜索,则搜索应该返回所有 3 个文件及其路径。

所以问题是 - 如何找到同一父目录中存在的同名重复文件?

我使用的是 Windows SP2 和 PHP。我只需要搜索结果,无论它是如何提供的。任何内容,例如命令提示符、PHP 逻辑、javascript 逻辑或任何提供结果的软件。

我已经回答过一些问题,但它们对我没有帮助。

  1. 如何在 Linux 中查找存在于同一目录中的同名但大小写不同的重复文件?
  2. https://stackoverflow.com/questions/6470258/how-do-i-find-all-files-with-the-same-name-in-all-subdirectories

答案1

这是一个函数,它递归地解析指定的目录树并创建一个关联数组,该数组的键是所有子目录中的文件名,值是相应的路径。运行此函数后,您所要做的就是遍历结果并删除出现次数高于 1 的任何文件:

function scandir_recursive($dir, &$result = array()) {
    $dir = rtrim($dir, DIRECTORY_SEPARATOR);

    foreach (scandir($dir) as $node) {
        if ($node !== '.' and $node !== '..') {
            if (is_dir($dir . DIRECTORY_SEPARATOR . $node)) {
                scandir_recursive($dir . DIRECTORY_SEPARATOR . $node, $result);
            } else {
                $result[$node][] = $dir . DIRECTORY_SEPARATOR . $node;
            }
        }
    }

    return $result;
}

print_r(scandir_recursive(__DIR__));

答案2

请安装任何 IDE,如 Netbeans 或 eclipse

该选项卡中有一个名为文件搜索的选项,您必须指定文件名,然后搜索它将为您提供所有同名文件

或者您可以在 Windows 中进行常规文件搜索

我不知道是否有任何方法可以使用 php 获取所有目录中的文件

答案3

如果你无法使用 Windows 工具单独完成此操作,或者想要使用 PHP 完成此操作,则可以执行以下操作

$iterator = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator('/path/you/want/to/search/in')
);

$allFiles = array();

foreach ($iterator as $fileObject) {
    $fileName = $fileObject->getFilename();
    if (!isset($files[$fileName])) {
        $files[$fileName] = array();
    }
    $files[$fileName][] = $fileObject->getPathname();
}

这将为您提供该路径下的所有文件,并按文件名键入,例如

array(
    'foo.txt' => array('/path/to/foo.txt'),
    'bar.txt' => array(
        '/path/to/bar.txt',
        '/path/to/deeper/bar.txt',
    ),
);

为了得到重复项,你只需过滤掉所有只有一个元素的数组:

$dupes = array_filter(
    $allFiles, 
    function(array $sameNamedFiles) {
        return count($sameNamedFiles) > 1;
    }
);

结果将会是这样的

array(
    'bar.txt' => array(
        '/path/to/bar.txt',
        '/path/to/deeper/bar.txt',
    ),
);

如果你想要一个“平面”数组,请使用

$dupes = array_reduce(
    $files, 
    function($dupes, array $sameNamedFiles) {
        if (count($sameNamedFiles) > 1) {
            $dupes = array_merge($dupes, $sameNamedFiles);
        }
        return $dupes;
    },
    array()
);

这将导致类似

array(
    '/path/to/bar.txt',
    '/path/to/deeper/bar.txt',
)

注意:以上内容尚未经过测试,但可以为您指明大致方向。

相关内容