У меня есть два диска, скажем, диск 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
Если я уберу /s
переключатель из dir
команды, то она сработает, поскольку %%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:D
переключателем, но в этом случае используйтеrd
вместоdel
команды toудалить папку; используетсяrd /S
для удаления всего дерева папок (всех файлов и подпапок, кроме самой папки). %%~pnxa
расширяется%%a
до полногопуть + имя + расширениевключая ведущий\
(безG:
спецификации диска);del "%%~a"
полный путь в двойных кавычках для правильной обработки путей с пробелами;- Я рекомендую
"delims="
вместо этого"tokens=*"
правильно обрабатывать возможные начальные пробелы в именах файлов (это могло бы иметь место и без/S
флага); - рассмотрите дополнительные параметры командной строки (см.
del /?
иrd /?
).