将一个文件夹中的文件路径递归映射到另一个文件夹
Recursively mapping file paths in one folder to another folder
假设我有一个文件夹 (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 中的文件,这样:
/folder_1/dir_1/file_1_1.txt
映射到 /folder_2/dir_1/file_1_1.txt
。
/folder_1/dir_1/file_1_1.txt
映射到 /folder_2/dir_1/default.txt
/folder_1/dir_2/file_2_1.txt
映射到 /folder_2/dir_2/file_2_1.txt
/folder_1/dir_2/dir_2_1/file_2_1_1.txt
映射到 /folder_2/dir_2/default.txt
/folder_1/file_1.txt
映射到 /folder_2/default.txt
我不是最好的沟通者,所以希望以上模式对你们有意义。这个问题确实与语言无关,但是 PHP and/or Javascript 中的答案真的很棒。
到目前为止,我能够在 PHP 中使用 FileIterator、RecursiveDirectoryIterator 和一堆自定义 类 来完成此操作,这些自定义 类 将路径一个一个地提取并映射到文件。
这让我想知道我是否缺少一种更简单的方法来完成这个简单的映射。也许使用正则表达式命名组之类的?
**编辑:**
是否有可能对于 folder_1 中的每个文件(文件路径),我们使用正则表达式模式从地图中找到(减少)最佳匹配folder_2?
中的所有文件路径
进一步编辑:
这是为了将folder_1中的数据文件映射到folder_2中的模板文件。如果对于 folder_1 中的文件,在 folder_2 中找不到完全匹配的文件路径(包括文件名),我们寻找 default.txt
。如果未找到 default.txt
,则我们向上移动一个目录并使用该父目录的 default.txt
。这样,我们不断向上移动目录级别,直到找到第一个 default.txt
.
首先,使用递归目录扫描器扫描所有 folder_2
目录树。构建一个包含文件名的散列 table,不带 folder_2
前缀。所以你的散列 table 将包含:
/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
,然后在散列 table 中查找结果字符串。如果它在那里,那么你就有了一场比赛。
如果文件不存在,将最后一段替换为"default.txt",然后重试。因此,当您开始扫描 folder_1
时,您会得到:
/folder_1/dir_1/file_1_1.txt
您在散列 table 中查找 dir_1/file_1_1.txt
并找到它。你有一场比赛。
接下来,你得到 /folder_1/dir_1/file_1_2.txt
。您在散列 table 中查找 /dir_1/file_1_2.txt
但没有找到它。因此,您将 file_1_2.txt
替换为 default.txt
,从而得到 /dir_1/default.txt
。你在散列 table 中查找它,找到它,你就有了一个匹配项。
现在,如果 /dir_1/default.txt
不存在,那么您将再次调整文件名以删除最后一个目录。也就是说,您将删除 /dir_1
,然后在散列 table.
中查找 /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
假设我有一个文件夹 (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 中的文件,这样:
/folder_1/dir_1/file_1_1.txt
映射到/folder_2/dir_1/file_1_1.txt
。/folder_1/dir_1/file_1_1.txt
映射到/folder_2/dir_1/default.txt
/folder_1/dir_2/file_2_1.txt
映射到/folder_2/dir_2/file_2_1.txt
/folder_1/dir_2/dir_2_1/file_2_1_1.txt
映射到/folder_2/dir_2/default.txt
/folder_1/file_1.txt
映射到/folder_2/default.txt
我不是最好的沟通者,所以希望以上模式对你们有意义。这个问题确实与语言无关,但是 PHP and/or Javascript 中的答案真的很棒。
到目前为止,我能够在 PHP 中使用 FileIterator、RecursiveDirectoryIterator 和一堆自定义 类 来完成此操作,这些自定义 类 将路径一个一个地提取并映射到文件。
这让我想知道我是否缺少一种更简单的方法来完成这个简单的映射。也许使用正则表达式命名组之类的?
**编辑:**
是否有可能对于 folder_1 中的每个文件(文件路径),我们使用正则表达式模式从地图中找到(减少)最佳匹配folder_2?
中的所有文件路径进一步编辑:
这是为了将folder_1中的数据文件映射到folder_2中的模板文件。如果对于 folder_1 中的文件,在 folder_2 中找不到完全匹配的文件路径(包括文件名),我们寻找 default.txt
。如果未找到 default.txt
,则我们向上移动一个目录并使用该父目录的 default.txt
。这样,我们不断向上移动目录级别,直到找到第一个 default.txt
.
首先,使用递归目录扫描器扫描所有 folder_2
目录树。构建一个包含文件名的散列 table,不带 folder_2
前缀。所以你的散列 table 将包含:
/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
,然后在散列 table 中查找结果字符串。如果它在那里,那么你就有了一场比赛。
如果文件不存在,将最后一段替换为"default.txt",然后重试。因此,当您开始扫描 folder_1
时,您会得到:
/folder_1/dir_1/file_1_1.txt
您在散列 table 中查找 dir_1/file_1_1.txt
并找到它。你有一场比赛。
接下来,你得到 /folder_1/dir_1/file_1_2.txt
。您在散列 table 中查找 /dir_1/file_1_2.txt
但没有找到它。因此,您将 file_1_2.txt
替换为 default.txt
,从而得到 /dir_1/default.txt
。你在散列 table 中查找它,找到它,你就有了一个匹配项。
现在,如果 /dir_1/default.txt
不存在,那么您将再次调整文件名以删除最后一个目录。也就是说,您将删除 /dir_1
,然后在散列 table.
/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