Удалите все файлы после даты, код медленный

На прошлой неделе я задал вопрос о получении командного файла или кода для удаления всех файлов .txt в папке, которые были созданы до последних 60 дней, и мне было предложено использовать приведенный ниже код.

forfiles -p "J:\Test_Files" -s -m *.txt* -d 60 -c "cmd /c del @path"

Этот код выполняет свою работу и работает нормально, но он слишком медленно удаляет 250 файлов в минуту. Мне нужно удалить в общей сложности 2 600 000 файлов, и это займет слишком много времени.

Код, который я использовал ниже, удаляет 200 файлов в секунду, но удаляет все файлы .txt.

cd /BASE_PATH
del /s *.txt

Как я могу отредактировать этот код, чтобы удалить файлы, созданные до 60 дней? Мне нужно, чтобы он удалялся побыстрее.

Спасибо за помощь! : D


person TevinTwoTimes    schedule 26.10.2015    source источник
comment
Есть много ответов, которые не используют forfiles в этих вопросах: stackoverflow.com/questions/324267/ stackoverflow.com/questions/51054/   -  person Jerry Jeremiah    schedule 27.10.2015
comment
Хотелось бы увидеть какие-то результаты по всему этому. Конечно, скорость зависит от среды, с которой вы работаете.   -  person Squashman    schedule 27.10.2015
comment
В вашем последнем посте сказано 1,4 миллиона. Вы почти вдвое увеличили сумму, которую нужно удалить. Как вы оцениваете, сколько файлов необходимо, чтобы проверить, не старше ли файл X дней?   -  person Squashman    schedule 27.10.2015
comment
Эээ, разве вам не нужно указывать -d -60? Разве ваш код в представленном виде не выбирает и, следовательно, не удаляет файлы новее, чем за 60 дней?   -  person Bacon Bits    schedule 27.10.2015
comment
Я допустил ошибку в посте. На самом деле это -60 вместо 60. Также мой последний пост был для другой файловой папки, где мне просто нужно было удалить все файлы .txt. В этом случае это должно быть до последних 60 дней, вызывающих мою проблему.   -  person TevinTwoTimes    schedule 27.10.2015


Ответы (1)


Вы можете попробовать

@echo off
    setlocal enableextensions disabledelayedexpansion

    rem Configure script
    set "target=J:\Test_Files"
    set "fileMask=*.txt"
    set "age=60"

    rem We will use a temporary file. 
    for %%t in ("%temp%\%~nx0.%random%%random%%random%.tmp") do (

        rem Send to temp file the list of matching files retrieved by the robocopy command
        >"%%~ft" robocopy "%target%." "%target%." "%fileMask%" /minage:%age% /l /nocopy /is /s /njh /njs /ndl /nc /ns

        rem Process temporary file deleting the selected files
        for /f "usebackq tokens=*" %%f in ("%%~ft") do echo del "%%~ff"

        rem Once done, remove the temporary file
    ) & del /q "%%~ft"

del команды выводятся только на консоль. Если вывод правильный, удалите команду echo.

person MC ND    schedule 27.10.2015
comment
Да! Это работает! Спасибо за это, массово удаляется намного быстрее, чем код forfiles - person TevinTwoTimes; 27.10.2015
comment
@MC ND, есть ли причина, по которой вы решили поместить временное имя файла в токен FOR вместо того, чтобы просто назначить его напрямую переменной окружения? Мне нравится, как вы пользуетесь Robocopy. Я делал что-то очень похожее, чтобы найти файлы размером больше X байтов. Это в миллион раз быстрее, чем проверка% ~ zI с помощью команды FOR. - person Squashman; 27.10.2015
comment
@Squashman, просто дурная привычка. Мне легче читать, визуально ограничивать конструкцией for и легче писать, ссылаясь на временный файл через заменяемый параметр for, и у меня есть преимущества использования переменной, но с меньшим количеством символов. И я должен согласиться, robocopy и xcopy - это два гаечных ключа, которые при необходимости красиво гвоздят - person MC ND; 27.10.2015