Как удалить дубликаты и файлы небольшого размера в каталоге - PullRequest
1 голос
/ 30 марта 2020

у меня несколько миллионов файлов в одном каталоге:

размер 07kb - "johnny.zip"

размер 57kb - "johnny (1) .zip "

размер 13kb -" Джонни (2) .zip "

размер 12kb -" dhick.zip "

размер 11kb - "dhick (5) .zip"

размер 34kb - "dhick (8) .zip"


я хочу сохранить только один самый большой файл для каждого найденного имени. Исключая все другие меньшие и дубликаты, в этом случае:


размер 07kb - "johnny.zip" <<< УДАЛИТЬ ЭТО! (потому что дублируется и меньше по размеру) </p>

размер 57kb - "johnny (1) .zip" ничего не делать ...

размер 13kb - "johnny (2) .zip" <<< УДАЛИТЬ ЭТО! (потому что дубликаты и меньше по размеру) </p>

размер 12kb - "dick.zip" <<< УДАЛИТЬ ЭТО! (потому что дублируют и меньше по размеру) </p>

размер 11kb - "dick (5) .zip" <<< УДАЛИТЬ ЭТО! (потому что дубликаты и меньше по размеру) </p>

размер 34kb - "член (8) .zip" ничего не делать ...


Как мне сделать, пожалуйста?

1 Ответ

1 голос
/ 01 апреля 2020
@echo off
setlocal

for %%A in (*.zip) do (
    for /f "eol=| delims=(" %%B in ("%%~nA") do (
        set "string=%%~B"
        call :trim

        for /f "skip=1 eol=| delims=" %%C in (
            'call dir /b /o-s "%%string%%*.zip"'
        ) do (
            del "%%~C"
        )
    )
)

exit /b

:trim
if "%string:~-1%" == " " set "string=%string:~0,-1%" & goto :trim
for /f "tokens=*" %%A in ("%string%") do set "string=%%~A"
exit /b 0

Так я бы попытался выполнить задачу. Быть несколькими миллионами файлов - это большая проблема, поэтому пытаться делать все это в памяти с помощью сортировки et c. может быть сложно. Он пытается перебрать файл, получить базовое имя ( строку перед любыми закрывающими скобками ) и добавить *.zip, чтобы отсортировать файлы и удалить файлы меньшего размера, оставив только самый большой файл. , Надеюсь, у вас не слишком много одного базового имени, например johnny.

. Хотя я провел несколько простых тестов, это не доказано полностью без сомнения. Может быть безопаснее использовать ren вместо del, например: ren "%%~C" "%%~nC.bak". Если что-то не так, используйте ren *.bak *.zip для отмены. Если правильно del *.bak. Протестируйте небольшую группу скопированных файлов, чтобы убедиться, что она работает должным образом. Я утверждаю, что del нельзя отменить.

dir /b /o-s будет сортировать по размеру ( по величине 1-й ), поэтому просто нужно skip 1 и удалить остальные. call используется для расширения %%string%%, поэтому использование отложенного расширения не используется. Метка :trim удаляет пробелы в любом конце строки, которые присутствуют после разделения на (, поэтому для правильного поиска по шаблону необходимо удалить пробел.

...