Рекурсивное сопоставление путей к файлам из одной папки в другую папку

Допустим, у меня есть папка (folder_1) со следующей структурой:

/folder_1
/dir_1
- file_1_1.txt
- file_1_2.txt
/dir_2
- file_2_1.txt
/dir_2_1
- file_2_1_1.txt
- file_1.txt

Теперь, скажем, у меня есть другая папка (folder_2) со следующей структурой:

/folder_2
/dir_1
- file_1_1.txt
- default.txt
/dir_2
- file_2_1.txt
- default.txt
- default.txt

Мне нужно отобразить каждый файл в folder_1 в файл в folder_2 такой что:

  1. /folder_1/dir_1/file_1_1.txt карты для /folder_2/dir_1/file_1_1.txt,
  2. /folder_1/dir_1/file_1_1.txt карты для /folder_2/dir_1/default.txt
  3. /folder_1/dir_2/file_2_1.txt карты для /folder_2/dir_2/file_2_1.txt
  4. /folder_1/dir_2/dir_2_1/file_2_1_1.txt карты для /folder_2/dir_2/default.txt
  5. /folder_1/file_1.txt карты для /folder_2/default.txt

Я не лучший коммуникатор, так что, надеюсь, приведенная выше схема имеет смысл для вас, ребята. Вопрос на самом деле не зависит от языка, но ответ на PHP и / или Javascript был бы действительно хорош.

До сих пор я смог выполнить это в PHP с помощью FileIterator, RecursiveDirectoryIterator и нескольких пользовательских классов, которые извлекают и затем отображают путь к файлам один за другим.

Это заставляет меня задуматься, упускаю ли я более простой способ сделать это простое картирование. Может быть, с помощью регулярных выражений именованных групп или что-то?

**Редактировать: **

Возможно ли, что для каждого файла (путь к файлу) в folder_1, мы используем шаблон регулярных выражений, чтобы найти (уменьшить) лучшее совпадение из карты всех путей к файлам в folder_2?

Дальнейшее редактирование:

Это для отображения файлов данных в folder_1 чтобы шаблоны файлов в folder_2. Если для файла в folder_1, точный путь к файлу (включая имя файла) в folder_2 не найден, ищем default.txt, Если default.txt не найден, то мы перемещаем каталог вверх и используем этот родительский каталог default.txt, Таким образом, мы продолжаем продвигаться вверх по уровням каталогов, пока не найдем первый default.txt,

0

Решение

Во-первых, используйте ваш рекурсивный сканер каталогов для сканирования всех folder_2 Дерево каталогов. Создайте хеш-таблицу, содержащую имена файлов, без folder_2 префикс. Таким образом, ваша хеш-таблица будет содержать:

/dir_1
/dir_1/file_1_1.txt
/dir_1/default.txt
/dir_2/file_2_1.txt
/dir_2/default.txt
/default.txt

Теперь начните сканирование folder_1, Когда вы получите файл, раздеться folder_1 и найдите результирующую строку в хеш-таблице. Если это там, то у вас есть совпадение.

Если файла нет, замените последний сегмент на «default.txt» и повторите попытку. Итак, когда вы начинаете сканирование folder_1, ты получаешь:

/folder_1/dir_1/file_1_1.txt

Ты смотришь вверх dir_1/file_1_1.txt в хэш-таблице и найдите его. У вас есть матч.

Далее вы получаете /folder_1/dir_1/file_1_2.txt, Ты смотришь вверх /dir_1/file_1_2.txt в хэш-таблице и не найти его. Итак, вы замените file_1_2.txt с default.txt, давая вам /dir_1/default.txt, Вы смотрите это в хэш-таблице, находите ее, и у вас есть совпадение.

Сейчас если /dir_1/default.txt не существует, то вы снова измените имя файла, чтобы удалить последний каталог. То есть вы бы удалили /dir_1и вы бы посмотрели вверх /default.txt в хеш-таблице.

В псевдокоде это выглядит так:

for each file in folder_1
name = strip `/folder_1` from the name
if name in hash table then
match found
continue (next file)
end if
replace file name (everything after the last '/') with "default.txt"do
if name in hash table then
match found
continue (next file)
end if
remove the last slash, and everything between it and the previous slash.
(so "/dir_1/default.txt" becomes "/default.txt")
while name.length > 0

// if you get here, no match was found
end for
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]