如何删除子目录中与父目录中文件名称相同的文件?

我有一个具有以下文件结构的文件夹:

  • 根(DIR)
    • Filename1.jpg
    • Filename2.jpg
    • Filename3.jpg
    • 子目录(DIR)
      • Filename1.jpg
      • Filename2.jpg
      • Filename3.jpg
      • SubDirectory2(DIR)
        • FileName1.jpg
        • FileName2.jpg

模式继续n次。

我如何删除子目录中的文件,如果它存在于文件夹/文件层次结构中的更高级别? 所以,我试图摆脱子目录中的重复文件,如果相同的文件名称存在于更高级别的文件夹中。

这可以通过两个FOR循环和一个IF条件来完成:

@echo off rem Process all files in current directory and all its subdirectories. rem For each file first check if the file still exists after processing rem the other files before. rem For each file still existing search for this file in its directory rem and all its subdirectories with skipping from output of command DIR rem the first line which is the current file to keep. for /F "delims=" %%I in ('dir * /AD /B /S 2^>nul') do ( if exist "%%I" ( for /F "skip=1 delims=" %%J in ('dir "%%I" /AD /B /S 2^>nul') do del "%%J" 2>nul ) ) 

注意:批处理文件在执行时不应该被删除。 这可以通过让它不存储在目录树中进行处理,或者只在目录树中处理一次,或者至少在目录树顶层运行批处理文件来处理。

当然可以在第一个目录中指定例如*.jpg *.png *.tif而不是只处理JPEG,PNG和TIFF文件,并忽略目录树中的所有其他文件。

请使用此修改后的版本进行测试运行而不删除实际文件:

 @echo off for /F "delims=" %%I in ('dir * /AD /B /S 2^>nul') do ( echo File: "%%I" if exist "%%I" ( for /F "skip=1 delims=" %%J in ('dir "%%I" /AD /B /S 2^>nul') do echo del "%%J" 2>nul ) ) 

当删除文件真的完成时,将会有更少的行输出,因为if exist "%%I"将不会总是如此批处理代码。

为了理解使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • del /?
  • dir /?
  • echo /?
  • if /?

另请阅读Microsoft有关使用命令重定向运算符的文章,了解2>nul通过将它们从句柄STDERR重定向到设备NUL来抑制错误消息。

重定向操作符>必须在第一个FOR命令行中用符号字符^进行转义,在通过Windows命令解释程序处理FOR命令行时将其解释为文字字符,而在后台由FOR执行的单独命令进程作为重定向操作符执行DIR命令行,并捕获其输出写入处理STDOUTFOR处理。