2017-07-28 97 views
1

我有以下文件结构的文件夹:如何删除与父目录中的文件具有相同名称的子目录中的文件?

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

等。模式继续n次。

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

+3

你有什么试过,你试过的怎么都失败了?理想情况下,您应该提供您尝试过的[最小,完整和可验证的示例](https://stackoverflow.com/help/mcve),并包含有关失败的具体信息,包含错误消息和/或错误的输出。 SO不是代码写入服务;最好的问题是提供有用信息的问题,以便那些回答问题的人可以指导你设计自己的正确答案。参见[如何提出一个好问题](https://stackoverflow.com/help/how-to-ask)。 –

+0

骨架:循环目录中的文件,对于每个文件运行通过所有子文件夹,检查文件是否具有相同的文件名,将其删除。你可以轻松地谷歌的东西在一起,你需要的:) – geisterfurz007

回答

0

这可以用只有两个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 * /A-D /B /S 2^>nul') do (
    if exist "%%I" (
     for /F "skip=1 delims=" %%J in ('dir "%%I" /A-D /B /S 2^>nul') do del "%%J" 2>nul 
    ) 
) 

注:在执行它的批处理文件不应该被删除。这可以通过让它不存储在目录树中进行处理,或者只在目录树中处理一次,或者至少在最高级目录树上运行批处理文件来处理来实现。

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

请使用测试运行这个修改后的版本没有真正删除文件:

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

会有线产量不足时,文件的删除,因为if exist "%%I"是真的做不会总是正确的,因为它是这种批处理代码的情况。

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

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

阅读也是微软文章的2>nul解释由手柄把它们放在STDERR,制止错误信息大约Using Command Redirection Operators设备NUL

重定向操作符>必须在第一转义FOR与脱字符^命令行被解释为文字字符由Windows命令解释器,但作为重定向操作以后由单独的命令过程处理所述FOR命令行通过FOR在后台执行的DIR命令行并捕获其输出写入由处理STDOUT用于处理执行。

相关问题