![如何查找同一父目录中存在的同名重复文件?](https://linux22.com/image/1337546/%E5%A6%82%E4%BD%95%E6%9F%A5%E6%89%BE%E5%90%8C%E4%B8%80%E7%88%B6%E7%9B%AE%E5%BD%95%E4%B8%AD%E5%AD%98%E5%9C%A8%E7%9A%84%E5%90%8C%E5%90%8D%E9%87%8D%E5%A4%8D%E6%96%87%E4%BB%B6%EF%BC%9F.png)
我正在清理我的项目。项目中有一些模块正在被重命名、新建或直接复制。在此过程中,我直接复制了重命名的目录或创建了新目录。现在我想删除旧目录文件。所以我想要所有具有相同名称的路径的文件。(计数 > 2)。有 500 多个此类文件。可以是 css、tpl、php 或 js 文件。
IE
- 主页/游戏/troy.php
- 主页/游戏/儿童游戏/troy.php
- 主页/游戏/体育/troy.php
如果在主目录上完成搜索,则搜索应该返回所有 3 个文件及其路径。
所以问题是 - 如何找到同一父目录中存在的同名重复文件?
我使用的是 Windows SP2 和 PHP。我只需要搜索结果,无论它是如何提供的。任何内容,例如命令提示符、PHP 逻辑、javascript 逻辑或任何提供结果的软件。
我已经回答过一些问题,但它们对我没有帮助。
答案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',
)
注意:以上内容尚未经过测试,但可以为您指明大致方向。