如何通过将递归路径添加到文件名来将嵌套目录结构的所有文件复制到一个新目录中?

How do I copy all files of a nested directory structure into one new directory with adding the recursive path to the file name?

也许有人可以帮我解决我的问题:学生通过我想在本地查看(并相互比较)的 MS Teams 作业上传他们的 java 代码。

作为老师,我可以批量下载所有提交的内容。解压缩 zip 显示以下结构:

我正在寻找的是一个小批量,它将所有特定于项目的提交集中在一个目录中(以便能够进行简单的比较)。 为了便于识别,必须将学生姓名和所有前导子目录添加到新文件名中。

因此,在调用“collectSubmissions.bat”之后,结果应该是一个名为“Submissions”的新目录,其中包含如下所有文件:

我做了一些研究并尝试了不同的方法(从 How can I recursively copy files of a specific pattern into a single flat folder on Windows? 开始)并在这里找到了一个非常接近我的需求的方法:

但这里只使用最近的父目录名。但就我而言,可以有多个嵌套文件夹,所以我希望有人能给我一些建议。

非常感谢您的帮助!

@ECHO Off
SETLOCAL ENABLEDELAYEDEXPANSION
rem The following settings for the source directory, destination directory, target directory,
rem batch directory, filenames, output filename and temporary filename [if shown] are names
rem that I use for testing and deliberately include names which include spaces to make sure
rem that the process works using such names. These will need to be changed to suit your situation.

SET "sourcedir=u:\your files"
SET "destdir=u:\your results"

SET "remove=%sourcedir:\=-%"

FOR /f "delims=" %%b IN ('dir /b /s /a-d "%sourcedir%\*" ') DO (
 SET "fullname=%%b"
 FOR /f "tokens=1,2*delims=\" %%u IN ("!fullname:%sourcedir%\=!") DO (
  MD "%destdir%\%%v" 2>NUL
  SET "newname=%%u-%%w"
  SET "newname=!newname:\=-!"
  COPY "%%b" "%destdir%\%%v\!newname!" >nul
 )
)

GOTO :EOF

关于实用性(假设这是一项剽窃检测练习)

学生可以通过

使检测变得困难
  • 更改文件中的空格
  • 正在更改 variable/method 名称
  • 更改文件中定义方法的顺序
  • 更改语句的顺序(例如,X、Y、Z 变为 Z、Y、X,其中这些语句不相互依赖)
  • 更改语句中术语的顺序(例如 x+33+x 不相同但产生相同的结果)

...以及其他