3

Я делаю уборку в моем проекте. В проекте есть несколько модулей, которые переименовываются, создаются заново или копируются напрямую. В этом процессе я непосредственно скопировал переименованный каталог или создал новый каталог. И теперь я хочу удалить старые файлы каталогов. Поэтому я хочу, чтобы все файлы с указанием пути имели одинаковые имена. (количество> 2). Существует более 500 файлов этого типа. Это могут быть файлы CSS, TPL, PHP или JS.

т.е.

  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

3 ответа3

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__));
0

пожалуйста, установите любую IDE, такую как Netbeans или Eclipse

в этой вкладке есть опция поиска файлов, вам нужно указать имя файла, а затем выполнить поиск, чтобы получить все файлы с одинаковыми именами.

или вы можете перейти на обычный поиск файлов в Windows

я не знаю, есть ли способ получить файлы во всех каталогах, используя php

0

Если вы не можете найти способ сделать это с помощью только инструментов 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',
)

Примечание: вышеупомянутое не проверено, но должно указать вам общее направление.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .