Windows CMD 在两个磁盘驱动器之间查找重复文件

Windows CMD 在两个磁盘驱动器之间查找重复文件

我有两个驱动器,假设驱动器 A (F:) 和驱动器 B (G:)。我曾经将驱动器 B 的所有内容复制到驱动器 A。但之后驱动器 B 中添加了一些新文件和文件夹。我想从驱动器 B 中删除重复的文件和文件夹,只保留驱动器 A 中不存在的文件和文件夹。

我尝试了下面的命令来检查是否找到了重复项,但它没有按我想要的方式工作,因为它在变量中有完整路径%%a。当然,如果它有效的话,现在的输出echo %%a将被等效的替换。DEL

@echo off
for /F "tokens=*" %%a in ('dir G:\*.* /b /s') do if not exist "F:\%%a" echo %%a >> C:\Users\billy\Desktop\files.txt
pause

如果我/sdir命令中删除开关,它就会起作用,因为它%%a只有文件名而不是完整路径,但它不能对子文件夹递归工作,所以它没那么有用。

答案1

@echo off
for /F "delims=" %%a in ('
  dir G:\*.* /b /s /A:-D
  ') do if not exist "F:%%~pnxa" echo del "%%~a" >> C:\Users\billy\Desktop\files.txt
pause

解释:

  • /A:-D从列表中排除目录(文件夹),因为后续del命令将删除文件而不是目录(按照del /?:如果指定了目录,则目录中的所有文件都将被删除,但文件夹本身不会被删除);
  • 分开处理文件夹:使用另一个与开关for /F相反但在这种情况下使用而不是命令来dir/A:Drddel删除文件夹;用于rd /S删除整个文件夹树(除文件夹本身之外的所有文件和子文件夹)。
  • %%~pnxa扩展%%a至完整路径+名称+扩展名包括一个前导\(无G:磁盘规范);
  • del "%%~a"双引号完整路径,以便正确处理带有空格的路径;
  • 我建议"delims="不要"tokens=*"正确处理文件名中可能出现的前导空格(无需任何标志即可实现/S);
  • 考虑额外的命令行开关(参见del /?rd /?)。

相关内容