Удалить дубликаты файлов в каталоге - PullRequest
0 голосов
/ 06 июня 2018

У меня есть рабочий скрипт, (ниже) , который сравнивает файлы только по размеру, а если один или несколько файлов имеют другой размер, он отображается на экране .bat.

@echo off
setlocal EnableDelayedExpansion

rem Group all file names by size
for /R %%a in (*.*) do (
   set "size[%%~Za]=!size[%%~Za]!,%%~Fa"
)

rem Show groups that have more than one element
for /F "tokens=2,3* delims=[]=," %%a in ('set size[') do (
   if "%%c" neq "" echo [%%a]: %%b,%%c
)
pause

Но мне нужно больше!

Мне также нужен скрипт удаления дубликатов файлов, сохраняя только один.Например, если есть 3 файлы одинакового размера, но с разными именами, сценарий должен выбрать один из них для сохранения, удалив другой 2.


@ LotPings, я попробовал с 2.pdf файлы, и это сообщение появилось на картинке ниже:

Error


@ LotPings

Теперь оно распознается нормально!Но он не удаляет дубликаты, а просто распознает .... Посмотрите на изображение ниже:

enter image description here

1 Ответ

0 голосов
/ 06 июня 2018
  • Я думаю, что обрабатывать файлы одинакового размера с одинаковым содержимым немного наивно.
    Если есть сомнения, лучше сравнить двоичный файл с fc.
  • Ваш способ вставить %%~Fa вСтрока без кавычек, каждое имя, возможно, содержащее пробелы, может быть проблематичным при дальнейшей обработке.
  • Если файлы идентичны, вы можете создавать ссылки.
  • Вы знаете что for /r превратится в подкаталоги?

Следующий пакет будет обрабатывать массив size[] по-разному, передавая размер и содержимое подпрограмме, которая хранит первый файл и (только выводит)Команда del.

:: Q:\Test\2018\06\06\SO_50723488.cmd
@echo off & setlocal
rem Group all file names by size
for /R %%a in (*.*) do call set size[%%~Za]=%%size[%%~Za]%%,"%%~Fa"

rem Process groups
for /F "tokens=2* delims=[]=," %%a in ('set size[') do Call :Sub %%a %%b

pause
Goto :Eof

:Sub
If "%~3"=="" (Set "size[%1]="&goto :EOf)
Echo ========================================
Echo processing %*
Echo Keep %2
Shift&shift

:loop
Echo Del  %1
if not "%~2"=="" (shift&goto :loop)

Пример вывода:

> Q:\Test\2018\06\06\SO_50723488.cmd
========================================
processing 0 "Q:\Test\2018\05\03\Text3.txt","Q:\Test\2018\05\27\log.html"
Keep "Q:\Test\2018\05\03\Text3.txt"
Del  "Q:\Test\2018\05\27\log.html"
========================================
processing 14 "Q:\Test\2018\05\03\Text1.txt","Q:\Test\2018\05\15\HP-G1610-20180515.json"
Keep "Q:\Test\2018\05\03\Text1.txt"
Del  "Q:\Test\2018\05\15\HP-G1610-20180515.json"
========================================
processing 21 "Q:\Test\2018\05\12\text1.txt","Q:\Test\2018\05\12\text2.txt"
Keep "Q:\Test\2018\05\12\text1.txt"
Del  "Q:\Test\2018\05\12\text2.txt"
========================================
processing 22 "Q:\Test\2018\05\20\2.txt","Q:\Test\2018\05\22\version.ps1"
Keep "Q:\Test\2018\05\20\2.txt"
Del  "Q:\Test\2018\05\22\version.ps1"
========================================
processing 288 "Q:\Test\2018\05\11\RawData.txt","Q:\Test\2018\05\23\SO_50478080.ps1"
Keep "Q:\Test\2018\05\11\RawData.txt"
Del  "Q:\Test\2018\05\23\SO_50478080.ps1"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...