如何从文件夹层次结构创建平面目录并处理重复文件?

时间:2014-06-25 13:33:16

标签: windows command-line

我想解析一个目录及其子目录,并复制目标目录中的所有文件,而忽略原始文件夹结构。所有文件都应直接复制到目标目录中。

我在Windows命令行找到了一个很好的解决方案:

for /r FolderA %f in (*) do @copy "%f" target

https://stackoverflow.com/a/1502183/772434

这一般工作正常,但我在源目录中有相同名称的重复文件。文件太多,所以我无法手工处理这些例外。

如何自动处理脚本中的这些文件? 选项:

  1. 复制期间覆盖文件
  2. 保留副本并重命名文件e。 G。通过在文件名末尾添加“__123”数字
  3. 比较文件(MDS5总和或类似)并仅在文件不同时创建副本。
  4. 我会更喜欢选项3(比较文件内容并仅在文件真的不同时保留编号副本),但我也对选项1和2的解决方案感兴趣(更实用)。 / p>

1 个答案:

答案 0 :(得分:1)

这是一种方法。我还没有对它进行测试,所以我希望它按预期工作。 有一个名为CURRENT_DUPLICATE_SUFFIX的全局变量。每次找到具有相同名称的文件但内容不同时,此值会递增并附加到生成的文件名

@echo off

SET SOURCE_DIR=C:\temp\LogAnalyzer
SET TARGET_DIR=C:\temp\test\output
SET CURRENT_DUPLICATE_SUFFIX=1

for /r "%SOURCE_DIR%" %%f in (*) do CALL :SUB1 "%%f"

GOTO END


:SUB1
    SET PURE_FILE_NAME=%~nx1
    SET TARGET_FILE_NAME=%TARGET_DIR%\%PURE_FILE_NAME%

    IF NOT EXIST "%TARGET_FILE_NAME%" (
            COPY %1 "%TARGET_DIR%"
            GOTO :EOF
    )

    REM if we are here, the target file exists.
    echo n |comp %1 "%TARGET_FILE_NAME%" >NUL 2>NUL

    REM in case the files have the same content
    IF %ERRORLEVEL%==0 GOTO :EOF

    SET TARGET_FILE_NAME=%TARGET_FILE_NAME%_%CURRENT_DUPLICATE_SUFFIX%
    SET /A CURRENT_DUPLICATE_SUFFIX=%CURRENT_DUPLICATE_SUFFIX%+1

    COPY %1 "%TARGET_FILE_NAME%

GOTO :EOF

:END