Como encontrar arquivos duplicados, ou seja, com o mesmo nome que existem no mesmo diretório pai?

3

Eu estou fazendo limpeza no meu projeto. Existem alguns módulos no projeto que estão sendo renomeados ou recém-criados ou copiados diretamente. Nesse processo, fiz diretamente o diretório renomeado copiado ou criei o novo diretório. E agora eu quero excluir arquivos de diretório antigos. Então eu quero todos os arquivos com seu caminho que estão com o mesmo nome. (conte > 2). Existem mais de 500 desses tipos de arquivos. Isso pode ser arquivos css, tpl, php ou js.

i.e.

  1. Principal / Games / troy.php
  2. Principal / Jogos / Jogos para crianças / troy.php
  3. Principal / Jogos / Esportes / troy.php

Se a pesquisa for feita no diretório principal, a pesquisa deverá retornar todos os 3 arquivos e seus caminhos.

Então pergunta é - Como encontrar arquivos duplicados, ou seja, com o mesmo nome que existem no mesmo diretório pai?

Estou usando o Windows SP2 e o PHP. Preciso apenas do resultado da pesquisa, não importa como ele seja fornecido. Qualquer coisa como prompt de comando, lógica PHP, lógica javascript, ou qualquer software que dê resultados.

Eu já passei por algumas perguntas, mas elas não são úteis para mim.

  1. Como encontrar arquivos duplicados com o mesmo nome, mas em casos diferentes que existem no mesmo diretório no Linux?
  2. link
por Somnath Muluk 07.11.2012 / 12:50

3 respostas

1

Aqui está uma função que analisa recursivamente a árvore de diretórios especificada e cria uma matriz associativa cujas chaves são os nomes de arquivos encontrados em todos os subdiretórios e cujos valores são os caminhos correspondentes. Depois de executar essa função, tudo o que você precisa fazer é iterar os resultados e remover qualquer arquivo que tenha uma contagem de aparições maior do que 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__));
    
por 07.11.2012 / 13:04
0

instale qualquer IDE como NetBeans ou eclipse

existe uma opção chamada pesquisa de arquivos nessa aba você tem que especificar o nome do arquivo e então procurar ele irá te fornecer todos os arquivos do mesmo nome

ou você pode ir para a pesquisa normal de arquivos no windows

não sei se existe alguma maneira de obter arquivos em todos os diretórios usando php

    
por 07.11.2012 / 12:56
0

Se você não consegue encontrar uma maneira de fazer isso com ferramentas do Windows sozinho e / ou quiser fazer isso com o PHP, você pode fazer

$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();
}

Isso fornecerá a você todos os arquivos dentro e abaixo desse caminho codificados por seu nome de arquivo, por exemplo,

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

Para obter os dupes, basta filtrar todos os arrays com apenas um elemento:

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

O resultado será algo como

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

Se você quiser um array "flat", use

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

Isso resultará em algo como

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

Nota: o acima não foi testado, mas deve apontar na direção geral.

    
por 07.11.2012 / 13:52