Robocopy удалить файлы старше n дней
Я ищу способ удалить все файлы старше 7 дней в пакетном файле. Я искал в Интернете и нашел несколько примеров с сотнями строк кода, а другие, которые требовали установки дополнительных утилит командной строки для выполнения этой задачи.
Подобные вещи можно сделать в BASH всего за пару строк кода. Кажется, что-то хотя бы удаленно можно сделать для пакетных файлов в Windows. Я ищу решение, которое работает в стандартной командной строке Windows, без каких-либо дополнительных утилит. Пожалуйста, не PowerShell или Cygwin либо.
gehrcke.de/timegaps был разработан для этой цели. Он даже допускает более сложную схему удаления: помимо хранения файлов за последние 7 дней, например, он также позволяет хранить один файл для каждой из последних 8 недель, 12 месяцев, 2 лет.Смотрите forfiles документацию для более подробной информации.
Если вы не forfiles установили его на свой компьютер, скопируйте его с любого Windows Server 2003 на компьютер с Windows XP по адресу %WinDir%\system32\ . Это возможно, поскольку EXE-файл полностью совместим с Windows Server 2003 и Windows XP.
Более поздние версии Windows и Windows Server устанавливают его по умолчанию.
Для Windows 7 и новее (включая Windows 10):
Синтаксис немного изменился. Поэтому обновленная команда:
Должно быть del @FILE, дело имеет значение. Также я предлагаю использовать / c echo @FILE для тестирования @Russell: @PATH - полный путь, включая имя. @FILE - это только имя, поэтому, если вы имеете дело с подпапками, оно не будет работать. Обратите внимание, что если вы хотите, чтобы файлы были старше 10 дней, вам нужно указать -d "-10". -ve означает «старше, чем», + ve означает «новее, чем». Вы также можете указать формат DDMMYY или -DDMMYY в качестве параметра -d. Я использовал этот синтаксис на Win Server 2008: forfiles / P "C: \ Mysql_backup" / S / M * .sql / D -30 / C "cmd / c del @PATH" Этот ответ работает, когда «старше 7 дней» определено как «изменено более 7 дней назад», а не «создано более 7 дней назад». Как можно достичь последнего?Переместите все файлы (используя / mov, который перемещает файлы, а затем удаляет их, в отличие от / move, который перемещает целые деревья файлов, которые затем удаляются), через robocopy в другое место, а затем выполните команду удаления по этому пути, и вы все хорошо.
Также, если у вас есть каталог с большим количеством данных, вы можете использовать /mir переключатель
@ adamb0mb это ни в коем случае нецелесообразно - если «destination» находится в той же файловой системе, что и «source» , операция перемещения довольно легкая. Поскольку robocopy действительно надежен, он на самом деле будет работать для любого размера каталога, скрытых имен файлов, в основном произвольной длины пути и включать каталоги, если вам это нужно - то, чего наверняка нельзя сказать о многих других утилитах Windows. Я бы использовал rd /s /q c:\destination вместо del команды, хотя или даже использовать другой robocopy /mir c:\emptydir c:\destination запуск, чтобы очистить каталог, если вы ожидаете проблемы с именами файлов. Кроме того, robocopy поддерживает UNC-пути - что forfiles из принятого ответа не подойдет. Мои мысли были более схожими: «Мои файлы уже там, где я хочу их. Я не хочу их перемещать». «Удаление файлов - это логически то, что вы делаете, так что делайте это. Не перегружайте Robocopy, чтобы сделать это» Я рекомендую этот однострочник для просмотра всех файлов C:\test старше 7 дней. Чтобы удалить файлы, изменить echo на del : forfiles /p "C:\test" /m "*.*" /c "cmd /c echo @file" /D -7Ok немного соскучился и придумал это, которое содержит мою версию замены эпохи Linux для бедного человека, ограниченную для ежедневного использования (без сохранения времени):
ПРИМЕНЕНИЕ
set /a strip=day*7 : Измените 7 на количество дней, чтобы сохранить.
set dSource=C:\temp : Это начальный каталог для проверки файлов.
Это неразрушающий код, он будет отображать то, что случилось бы.
поэтому файлы на самом деле удаляются
эпоха : я не принял во внимание время, так как необходимо удалить файлы старше определенной даты, так как часы / минуты удалили бы файлы со дня, который предназначался для хранения.
ОГРАНИЧЕНИЕ
Эпоха считает само собой разумеющимся, ваш короткий формат даты ГГГГ-ММ-ДД. Его необходимо адаптировать для других настроек или оценки времени выполнения (прочитайте sShortTime, пользовательскую конфигурацию, настройте правильный порядок полей в фильтре и используйте фильтр для извлечения правильных данных из аргумента).
Я упоминал, что ненавижу автоформатирование этого редактора? он удаляет пустые строки, а копирование-вставка - ад.
Надеюсь, это поможет.
+1 за неразрушающий код, я постараюсь учесть это, когда приведу примеры кода сам. Уже поздно и совершенно не связано, но 7daysclean.cmd звучит как удивительное название для группы Synth-Punk.Вы должны сделать /d -3 (3 дня назад) Это прекрасно работает для меня. Таким образом, все сложные партии могут быть в мусорном ведре. Также forfiles не поддерживаются пути UNC, поэтому установите сетевое соединение с конкретным диском.
Та же ошибка, что и в других ответах (в том числе принятых). Откуда появилась эта странная привычка уточнения *.* ? Подстановочный знак *.* не соответствует всем файлам в Windows. Он соответствует только файлам с . их именами. ОП никогда не говорил ничего о требовании . в имени файла. Правильный параметр есть /M * , но это все равно по умолчанию. Там нет необходимости /M вообще. @AnT: ты уверен? Я думаю, *.* ведет себя точно так же, как * в Windows. Фактически, я только что попробовал это на своем компьютере, и dir *.* действительно перечислил test file , файл без расширения. @ Андреас Рейбранд: Я тоже нахожу это удивительным, но трактовка *.* противоречит, скажем, dir и -m варианту forfiles . -m *.* Маска действительно пропустить extensionless имена файлов, как я уже говорил в моем комментарии выше (попробуйте сами). Самое смешное в том, что в документации MS явно указано, что -m *.* это по умолчанию. Однако, если вы попробуете это в реальной жизни, вы увидите, что по умолчанию на самом деле -m * - все файлы повторяются.Это удаляет файлы старше указанной даты. Я уверен, что это может быть изменено, чтобы вернуться на семь дней от текущей даты.
обновление: я заметил, что HerbCSO улучшил вышеупомянутый сценарий. Я рекомендую использовать его версию вместо.
@PATH - это просто путь в моем случае, поэтому мне пришлось использовать @PATH\@FILE
тоже forfiles /? не работает для меня тоже, но forfiles (без "?") работал нормально.
И единственный вопрос, который у меня есть: как добавить несколько масок (например, « .log | .bak»)?
Все это в отношении forfiles.exe, которое я скачал здесь (на win XP)
Но если вы используете сервер Windows, forfiles.exe уже должен быть, и он отличается от версии ftp. Вот почему я должен изменить команду.
Для Windows Server 2003 я использую эту команду:
Часто есть относительные вопросы, связанные с датой и временем, которые нужно решить с помощью командного файла. Но интерпретатор командной строки cmd.exe не имеет функции для вычисления даты / времени. Множество хороших рабочих решений, использующих дополнительные консольные приложения или скрипты, уже размещены здесь, на других страницах Stack Overflow и на других веб-сайтах.
Общим для операций, основанных на дате / времени, является требование преобразования строки даты / времени в секунды с определенного дня. Очень часто встречается 1970-01-01 00:00:00 UTC. Но любой последующий день также может быть использован в зависимости от диапазона дат, необходимого для поддержки конкретной задачи.
Джей опубликовал 7daysclean.cmd, содержащий быстрое решение «дата-секунды» для интерпретатора командной строки cmd.exe . Но это не учитывает правильных високосных лет. JR опубликовал дополнение для учета високосного дня в текущем году, но игнорирует другие високосные годы с базового года, то есть с 1970 года.
Уже более 20 лет я использую статические таблицы (массивы), созданные один раз с небольшой функцией C, для быстрого получения количества дней, включая високосные дни, с 1970-01-01 в функциях преобразования даты / времени в моих приложениях, написанных на C / C ++.
Этот очень быстрый табличный метод может быть использован также в пакетном коде с использованием команды FOR . Поэтому я решил закодировать пакетную подпрограмму, GetSeconds которая вычисляет количество секунд с 1970-01-01 00:00:00 UTC для строки даты / времени, переданной этой подпрограмме.
Примечание. Дополнительные секунды не учитываются, поскольку файловые системы Windows также не поддерживают дополнительные секунды.
Дни с 1970-01-01 00:00:00 UTC для каждого года, включая високосные дни.
Вычисление секунд для года с 2039 по 2106 с началом эпохи 1970-01-01 возможно только с использованием 32-разрядной переменной без знака, то есть без знака long (или без знака int) в C / C ++.
Информация о високосном году (нет / да) за период с 1970 по 2106 гг.
Количество дней до первого дня каждого месяца в текущем году.
Преобразование даты в число секунд с 1970-01-01 довольно легко с помощью этих таблиц.
Внимание, пожалуйста!
Формат строк даты и времени зависит от региона Windows и языковых настроек. Разделители и порядок маркеров , присвоенных переменных среды Day , Month и Year в первом ДЛЯ цикле GetSeconds должна быть адаптирована к местным формата даты / времени , если это необходимо.
Необходимо адаптировать строку даты переменной среды, если формат даты в переменной среды DATE отличается от формата даты, используемого командой FOR on %%
Например , когда %DATE% расширяется в Sun 02/08/2015 то время как %%
tF раскрывается в 02/08/2015 07:38 PM коде ниже может быть использован с модификации линии 4:
Это приводит к простой передаче подпрограммы 02/08/2015 - строки даты без трех букв сокращения дня недели и символа разделяющего пробела.
В качестве альтернативы можно использовать следующую для передачи текущей даты в правильном формате:
Теперь последние 10 символов из строки даты передаются в функцию, GetSeconds и поэтому не имеет значения, является ли строка даты переменной среды DATE с или без дня недели, если день и месяц всегда имеют 2 цифры в ожидаемом порядке, то есть в формате dd/mm/yyyy или dd.mm.yyyy .
Вот код пакета с поясняющими комментариями, который просто выводит, какой файл удалить и какой файл хранить в C:\Temp дереве папок, см. Код первого цикла FOR .
Для оптимальной производительности лучше всего удалить все комментарии, то есть все строки, начинающиеся с rem после 0-4 пробелов.
Далее код партии ниже оптимизирован для 24-часового формата времени.
Более подробную информацию о форматах даты и времени и сравнениях времени файлов в Windows см. В моем ответе « Узнайте, если файл старше 4 часов в пакетном файле, с большим количеством дополнительной информации о времени файла».
Robocopy – это консольная утилита Windows для копирования файлов, которую можно использовать для синхронизации/репликации файлов и каталогов, и в сценариях резервного копирования. Robocopy (Robust File Copy) доступна начиная с Windows NT 4.0 Resource Kit, но по умолчанию эта функция появилась только в Windows Vista и Windows Server 2008. Robocopy заменяет Xcopy и copy, как более функциональная.
Основные возможности Robocopy
Кроме обычного копирования файлов и папок из папки источника в каталог назначения, в Robocopy есть множество очень полезных функций:
- Устойчивость к обрывам сети (robocopy может продолжить копирования после восстановления сетевого доступа);
- Корректное копирование файлов с их атрибутами и NTFS правами доступа;
- Копирование с сохранением исходной временной метки;
- Возможность копирования файлов и директорий, запрещенных для доступа даже администратору, с помощью ключа /B (ключ позволяет игнорировать проверку прав доступа, ключ доступен только для участников группы Администраторы или Операторы архива);
- Возможность задать количество попыток копирования файла, если файл недоступен;
- Режим полного зеркалирования директорий;
- Пропуск уже существующих файлов (с одинаковым размером или временной меткой timestamp);
- Индикатор прогресса копирования;
- Корректная работа с длинными путями (более 260 символов);
- Эффективные алгоритмы и многопоточность позволяют выполнять копирование файлов намного быстрее, чем обычное копирование средствами Windows;
Официальной графической версии robocopy (c GUI) от Microsoft нет. Существуют пользовательские версии, но их поддержка прекращена. Список неофициальных GUI для robocopy (это сторонние программы):
Синтаксис и параметры robocopy
Синтаксис robocopy состоит из двух обязательных параметров (исходный и целевой каталог) и двух необязательных (фильтр файлов и параметры):
robocopy <source> <dest> [фильтр файлов] [параметры]
Поддерживаются как локальные пути, так и UNC, например, \\server\directory
Полный синтаксис утилиты robocopy (все параметры и их описания) доступны по команде:
Поскольку ключей в robocopy много, мы будем рассматривать их на практике, в готовых командах. Мы не будем рассматривать самые простые примеры использования robocopy, т.к. обычно они не вызывают вопросов. Ниже представлены готовые к применению более сложные команды robocopy, которые можно использовать в реальных сценариях.
Для тестирование различных команд robocopy без выполнения операций (копирования, перемещения или удаления) с файлами используется параметр /L . Данный параметр вернет список файлов и папок, которые будут скопированы вашей командой.Использование robocopy для зеркалирования каталогов
Вы можете зеркалировать (синхронизировать) содержимое двух каталог с помощью следующей команды robocopy (под зеркалированием понимается копирование файлов из целевой папки с удалением файлов в целевом каталоге, если они удалены в источнике).
robocopy \\testnode1\C$\source\ \\testnode2\c$\dest\ *.txt /MIR /COPYALL /Z /B /J /R:3 /W:1 /REG /TEE /LOG+:%appdata%\robocopy.log
Обратите внимание на ключ /Z даже если вы копируете небольшие файлы по устойчивому каналу. Он не несёт дополнительных расходов при использовании, но в случае обрыва, вы сможете продолжить копирование просто повторно запустив скрипт.
При копировании больших файлов (более 2 Гб) с некоторых iSCSI/SAN томов, процесс robocopy может существенно использовать оперативную память сервера. Проблем обычно связано с тем, что для данного LUN в настройках RAID используется write-through кэширование вместо write-back.Инкрементальное копирование с помощью robocopy
Сам по себе robocopy не может полностью обеспечить инкрементальное резервное копирование каталога (копирование новых и измененных файлов), для этого мы будем использовать небольшой bat скрипт:
Заметка. Если файловые системы source или dest не являются NTFS, используйте ключ /FFT , так как на других файловых системах (включая эмулированные NTFS) может возникнуть ошибка, из-за которой robocopy будет видеть старые файлы как измененные, из-за отличий в метке времени.Robocopy: перемещение файлов
С помощью ключа /mov или /move вы можете переместить файлы (а точнее удалить успешно скопированные файлы из исходной директории):
robocopy C:\source\ F:\dest\ /MOVE /E /COPYALL /Z /B /J /R:3 /W:1 /REG /TEE /LOG+:%appdata%\robocopy.log
- /MOVE – удалить файлы и директории из исходной папки, после того как они были скопированы. Имейте в виду, что этот ключ нужно использовать вместе с /E или /S, в противном случае вы перенесете только файлы, но не директории. Если вы хотите перенести только файлы, используйте ключ /MOV
- Если вы используете ключ /MOVE с ключом /E, то вы перенесете все файлы, директории (включая файлы внутри них) и пустые директории. Файлы и директории удалятся из исходной папки. /MOVE с /S даст такой же результат, но пустые директории не перенесутся и будут удалены.
- Если вы используете ключ /MOV с ключом /E, то вы перенесете все файлы, включая те, которые находятся в директориях и поддиректориях, также скопируются все директории (включая пустые), но они не будут удалены из исходного каталога, в отличие от файлов. Используя /MOV с /S, вы получите такой же результат, но пустые директории не будут скопированы.
Пример использование robocopy в планировщике задач
Для примера возьмём задачу: нам необходимо с помощью robocopy регулярно синхронизировать содержимое сетевой папки между двумя серверами с ведением логов.
Запустите командную строку с правами администратора и введите: compmgmt.msc
Перейдите в System Tools -> Task Scheduler Library. Создайте новое задание планировщика (Create task).
Укажите имя задания, и выберите пользователя из-под которого будет выполняться задание. Пользователь должен иметь доступ на чтению и запись в обоих каталогах (при копировании по сети между серверами домена можно использовать аккаунт System, в этом случае нужно предоставить на целевой каталог права RW для объекта computer сервера-источника) .
Выберите опцию Run whether user is logged on or not, для того чтобы задание выполнялось в фоновом режиме. Также отметьте Run with highest privileges. Эта опция сработает если аккаунт из-под которого выполняется задание, будет иметь права администратора.
Перейдите на вкладку Triggers и создайте новый триггер.
Выберите параметр On a schedule (по расписанию), выберите время начала и отметьте Repeat task every, указав интервал выполнения. В моём случае это 5 минут – каждые 5 минут, начиная с часа дня 22 апреля (обязательно измените эту дату на ту, которая нужна вам), директории будут синхронизированы. В for a duration of поставьте Indefinitely (бесконечно)
Перейдите во вкладку Actions и нажмите New…
Выберите Start a program, и укажите путь к .bat скрипту.
Содержание robocopy-mirror.bat:
Помимо журнала выполнения задания планировщика, robocopy будет писать собственный лог файл копирования в C:\robocopy.log. Если аккаунт из-под которого будет выполняться скрипт не имеет прав администратора, смените C:\robocopy.log на нужный вам путь.
Остальные настройки заполнять не надо. После нажатия на кнопку ОК, вас попросит ввести пароль от учетной записи, которую вы выбрали для запуска задания.
Если вы всё настроили правильно, директории должны начать синхронизироваться.
Если у вас возникли проблемы с выполнением скрипта, то обязательно проверьте вкладку History вашей задачи
Отслеживание изменений в каталогах с помощью robocopy
В robocopy есть встроенный механизм отслеживания изменений в исходном каталоге (и их последующего копирования) и встроенный планировщик – параметры /mon и /mot .
- /mon:N – проверяет исходную директорию на предмет изменений каждую 1 минуту, и если изменений в директории больше чем N, то будет произведено копирование в целевую директорию. Если задан параметр /mot:Y, то изменения будут проверяться каждые Y минут.
- /mot:N – проверяет исходную директорию на предмет изменений каждые N минут. Минимальное значение N = 1, в минутах. Если параметр /mon не задан, то будет считаться что /mon:1
.bat скрипт для зеркалирования с отслеживанием изменений с интервалом в 1 минуту. Этот скрипт нужно запускать из-под аккаунта с правами администратора.
Плюсы:
- Не нужно создавать задание в планировщике задач
- Подходит для непостоянного выполнения. Например, в течение нескольких часов, в таком случае запустить скрипт руками через CMD проще, чем создавать задание в планировщике
Минусы:
- Чтобы запустить .bat скрипт в фоновом режиме, нужно либо использовать VBS скрипт, либо стороннее ПО, например, NirCmd.
- Минимальный интервал поиска изменений и копирования – 1 минута. Для меньшего интервала нужно использовать PowerShell или bat скрипт.
Коды возврата (ошибки) robocopy
Ниже приведены стандартные коды возврата robocopy, которые можно использовать для обработки различных ошибок, которые возвращает утилита после выполнения действия копирования (кот возврата эта битовая маска).
Hex | Decimal | Meaning if set |
0x00 | 0 | No errors occurred, and no copying was done. The source and destination directory trees are completely synchronized. |
0x01 | 1 | One or more files were copied successfully (that is, new files have arrived). |
0x02 | 2 | Some Extra files or directories were detected. No files were copied Examine the output log for details. |
0x04 | 4 | Some Mismatched files or directories were detected. Examine the output log. Housekeeping might be required. |
0x08 | 8 | Some files or directories could not be copied (copy errors occurred and the retry limit was exceeded). Check these errors further. |
0x10 | 16 | Serious error. Robocopy did not copy any files. Either a usage error or an error due to insufficient access privileges on the source or destination directories. |
Коды возврата могут комбинироваться: | ||
0x03 | 3 | (2+1) Some files were copied. Additional files were present. No failure was encountered. |
0x05 | 5 | (4+1) Some files were copied. Some files were mismatched. No failure was encountered. |
0x06 | 6 | (4+2) Additional files and mismatched files exist. No files were copied and no failures were encountered. This means that the files already exist in the destination directory |
0x07 | 7 | (4+1+2) Files were copied, a file mismatch was present, and additional files were present. |
Любое значение больше 7 говорит о том, что при копировании через robocopy возникла ошибка. Вы можете обрабатывать эти ошибки в bat файле:
if %ERRORLEVEL% EQU 16 echo ***FATAL ERROR*** & goto end
if %ERRORLEVEL% EQU 15 echo OKCOPY + FAIL + MISMATCHES + XTRA & goto end
if %ERRORLEVEL% EQU 14 echo FAIL + MISMATCHES + XTRA & goto end
if %ERRORLEVEL% EQU 13 echo OKCOPY + FAIL + MISMATCHES & goto end
if %ERRORLEVEL% EQU 12 echo FAIL + MISMATCHES& goto end
if %ERRORLEVEL% EQU 11 echo OKCOPY + FAIL + XTRA & goto end
if %ERRORLEVEL% EQU 10 echo FAIL + XTRA & goto end
if %ERRORLEVEL% EQU 9 echo OKCOPY + FAIL & goto end
if %ERRORLEVEL% EQU 8 echo FAIL & goto end
if %ERRORLEVEL% EQU 7 echo OKCOPY + MISMATCHES + XTRA & goto end
if %ERRORLEVEL% EQU 6 echo MISMATCHES + XTRA & goto end
if %ERRORLEVEL% EQU 5 echo OKCOPY + MISMATCHES & goto end
if %ERRORLEVEL% EQU 4 echo MISMATCHES & goto end
if %ERRORLEVEL% EQU 3 echo OKCOPY + XTRA & goto end
if %ERRORLEVEL% EQU 2 echo XTRA & goto end
if %ERRORLEVEL% EQU 1 echo OKCOPY & goto end
if %ERRORLEVEL% EQU 0 echo No Change & goto end
:end
Утилита robocopy имеет огромный функционал и позволяет гибко настроить операции копирования. Как альтернативу robocopy в PowerShell можно использовать командлет Copy-Item, который хоть и менее функционален, но работает с объектной моделью PowerShell, что может быть важно, если вы часто используете PowerShell или используете цепочки автоматизации с другими языками программирования.
Как освободить место на диске в Windows - один из частых вопросов
Наверное, у каждого имеется один или несколько каталогов с большим количество личных файлов, которые накапливались годами. И вы ни раз задавались вопросом как освободить место на диске в Windows/ Возможно, это коллекция фотографий, аудио и видео, которая растет день ото дня. Или же директория с документами и программами. Чтобы бы не хранилось в этих каталогах, рано или поздно они начинают занимать достаточно много места на диске. В данном случае, самый простой способ освободить место - это переместить старые и большие файлы на другой диск. Многие пользователи не знают, что текущие версии Windows поставляются с инструментом, который может выполнить эту задачу быстро и просто. Программа называется "Robocopy" и вот несколько способов, как можно облегчить переполненный диск.
Примечание: Частой ошибкой начинающих пользователей является то, что они хранят абсолютно все свои данные на системном диске. Обычно, это каталоги вроде "Мои документы", который наполнен не только документами, но и всем возможным, включая большие видео файлы. И со временем объем данных возрастает до такого размера, что Windows начинает тормозить из-за нехватки свободного места на системном диске. Если уж с привычкой никак не справится, то стоит перенести каталог (Мои) Документы в другое место.
Примечание: Конечно, освободить место всегда можно при помощи полного форматирования диска, однако - это несколько радикальный метод.
Справка: Robocopy является мощной программой командной строки, которая, начиная с версии Vista, входит в состав Windows. Инструмент поддерживает набор параметров, которые делают утилиту универсальной. По сути, единственной задачей данной утилиты является копирование и перемещение файлов и папок из одних каталогов в другие, с учетом указанных условий.
Как переместить файлы старше указанного возраста в другой каталог с Robocopy в Windows
Откройте окно командной строки (описание можно найти здесь) и введите данную команду:
Примечание: Возможно, команда покажется вам весьма громоздкой и сложной. Но, поверьте, ее составление, а тем более копирование уже готового шаблона и вставка нужных каталогов, займет намного меньше времени, нежели попытка разгрести заполненные и плохо структурированные каталоги, такие как директории с названиями в стиле "Разобрать".
Здесь, и представляют собой полные пути до папок источника и получателя. В случае если в путях имеются пробелы, то их необходимо обрамлять двойными кавычками. после параметра "/MinAge" задает максимальное количество дней, которое вы хотите, чтобы файлы оставались в исходном каталоге. Чтобы не быть голословным, вот пример, который перемещает файлы старше 365 дней из папки "C:\YouData" в каталог "D:\OldData", а так же сохраняет лог в файл "D:\OldData\ListOfFilesMoved.txt".
- robocopy "C:\YourData" "D:\OldData" /S /MOVE /XA:SH /A-:SH /MinAge:365 /R:1 /W:1 /mt:32 /log:"D:\OldData\ListOfFilesMoved.txt"
Как переместить все файлы одного типа и старше определенного возраста в другую папку с Robocopy в Windows
Если вам нужно переместить файлы старше определенного возраста, но только одного типа, то достаточно после добавить расширение файла с комбинацией "*.". Например, чтобы переместить только старые mp3 файлы, команда будет выглядеть следующим образом:
- robocopy "C:\YourData" "D:\OldData" *.mp3 /S /MOVE /XA:SH /A-:SH /MinAge:365 /R:1 /W:1 /mt:32 /log:"D:\OldData\ListOfFilesMoved.txt"
Как переместить файлы размером больше заданного предела с Robocopy в Windows
Существует так же параметр для установки ограничения на размер перемещаемых файлов. Например, команда ниже будет перемещать только файлы размером более 100 Мб (на самом деле немного меньше из-за использования числа 1000 вместо 1024 при умножении)
- robocopy "C:\YourData" "D:\BigFiles" /S /MOVE /XA:SH /A-:SH /Min:100000000 /R:1 /W:1 /mt:32 /log:"D:\BigFiles\ListOfFilesMoved.txt"
Запуск любой из этих команд может занять некоторое время. Время выполнения напрямую зависит от параметров вашей системы и количества файлов, которые будут проверяться и копироваться. Если вы не включите в команду параметр "/log", то вместо создания файла с историей копирования, вся информация о перемещении будет отображаться в окне командной строки. В противном случае, в окне консоли ничего не будет отображаться, поэтому для корректного завершения необходимо дождаться, пока вместо мигающего курсора не появится полный путь до текущего каталога.
Назначение параметров программы Robocopy в Windows
Назначение различных параметров описано в следующей таблице:
Применять действие на подкаталоги
Перемещать файлы вместо копирования
Включать системные и скрытые файлы
Запрещает robocopy добавлять системный атрибут "скрытый" к файлам и каталогам получателя
Запрещает перемещение или копирование файлов возрастом менее N дней
Запрещает перемещение или копирование файлов размером менее N байт
Если при копировании или перемещении встречается заблокированный файл, то данный параметр указывает robocopy количество повторных попыток (N-раз)
Указывает robocopy ждать N секунд перед повторной попыткой
Параметр указывает количество одновременных процессов, которые будут копировать или перемещать файлы (многопоточность)
Создание файла журнала со списком всех скопированных или перемещенных файлов. Настоятельно рекомендуется указывать данный параметр.
Robocopy является мощным инструментом, но знайте, что у него нет никакой функцией отмены. Поэтому, перед использованием всегда делайте резервную копию, если это возможно. Для того, чтобы более подробно узнать обо всех его переключателях, введите в командной строке "robocopy /?" (без кавычек). Хоть, полное описание robocopy никак не поместится в рамках одной статьи. Тем не менее, даже этой информации вполне достаточно, чтобы уже сейчас начать использовать утилиту на полную мощность.
Теперь, вы знаете как можно быстро переместить старые и большие файлы на другой диск, тем самым освободив место на основном диске.
Я ищу способ удалить все файлы старше 7 дней в пакетном файле. Я поискал в Интернете и нашел несколько примеров с сотнями строк кода и другие, которые требовали установки дополнительных утилит командной строки для выполнения задачи.
Подобные вещи можно сделать в BASH в всего пара строк кода. Кажется, что что-то, по крайней мере, удаленно можно было сделать с пакетными файлами в Windows. Я ищу решение, которое работает в стандартной командной строке Windows без дополнительных утилит. Пожалуйста, не используйте PowerShell или Cygwin.
Для этой цели был разработан gehrcke.de/timegaps. Он даже позволяет использовать более сложную схему удаления: помимо хранения файлов за последние 7 дней, он, например, также позволяет хранить по одному файлу за последние 8 недель, 12 месяцев, 2 года.Дополнительные сведения см. В forfiles документации.
В более поздних версиях Windows и Windows Server он устанавливается по умолчанию.
Для Windows 7 и новее (включая Windows 10):
Немного изменился синтаксис. Поэтому обновленная команда:
Должен быть del @FILE, дело имеет значение. Также я предлагаю использовать / c echo @FILE для тестирования. @Russell: @PATH - это полный путь, включая имя. @FILE - это только имя, поэтому, если вы имеете дело с подпапками, это не сработает. Обратите внимание: если вы хотите, чтобы файлы были СТАРШЕ 10 дней, вам нужно указать -d "-10". -ve означает «старше», + ve означает «новее». Вы также можете указать формат DDMMYY или -DDMMYY в качестве параметра -d. Я использовал этот синтаксис в Win Server 2008: forfiles / P "C: \ Mysql_backup" / S / M * .sql / D -30 / C "cmd / c del @PATH" Этот ответ работает, когда «старше 7 дней» определяется как «изменено более 7 дней назад», а не «создано более 7 дней назад». Как достичь последнего?Переместите все файлы (используя / mov, который перемещает файлы, а затем удаляет их, в отличие от / move, который перемещает целые файловые деревья, которые затем удаляются) с помощью robocopy в другое место, а затем выполните команду удаления по этому пути, и вы все хороший.
Также, если у вас есть каталог с большим количеством данных, вы можете использовать переключатель /mir
По большей части это довольно непрактичный ответ. Если у меня есть каталог с большим количеством данных, он не будет работать. Я бы выбрал один из вариантов ответа, который делает это «на месте» Это никоим образом не непрактично - если "destination" находится в той же файловой системе, что и "source" , операция перемещения будет довольно легкой. Поскольку robocopy действительно надежен, он фактически будет работать для любого размера каталогов, неясных имен файлов, в основном произвольной длины пути и включать каталоги, если вам это нужно - чего, конечно, нельзя сказать о многих других Windows коммунальные услуги. Я бы использовал rd /s /q c:\destination вместо команды del или даже использовал бы другой запуск robocopy /mir c:\emptydir c:\destination для очистки каталога, если вы ожидаете проблем с именами файлов. Кроме того, robocopy поддерживает UNC-пути, а forfiles из принятого ответа не годится. Мои мысли были скорее примерно такими: «Мои файлы уже находятся там, где я хочу. Я не хочу, чтобы их нужно было перемещать». «Логически удаление файлов - это то, что вы делаете, так что делайте это. Не перегружайте Robocopy, чтобы это сделать» Я рекомендую этот однострочный режим для просмотра всех файлов в C:\test старше 7 дней. Чтобы удалить файлы, измените echo на del : forfiles /p "C:\test" /m "*.*" /c "cmd /c echo @file" /D -7Ok было немного скучно, и он придумал это, которое содержит мою версию замены эпохи Linux для бедняков, ограниченную для повседневного использования (без сохранения времени):
ПРИМЕНЕНИЕ
set /a strip=day*7 : измените 7 количество дней хранения.
set dSource=C:\temp : это начальный каталог для проверки файлов.
ПРИМЕЧАНИЯ
Это неразрушающий код, он покажет, что произошло бы.
Поэтому файлы на самом деле удаляются
Февраль : жестко задано значение 28 дней. Биссекстильные годы - это ад, правда. Если у кого-то есть идея, что не нужно добавлять 10 строк кода, продолжайте и опубликуйте, поэтому я добавляю ее в свой код.
эпоха : я не принимал во внимание время, так как необходимо удалить файлы старше определенной даты, если взять часы / минуты, чтобы удалить файлы из дня, который был предназначен для хранения.
ОГРАНИЧЕНИЕ
epoch считает само собой разумеющимся, что ваш краткий формат даты - ГГГГ-ММ-ДД. Его необходимо адаптировать для других настроек или оценки времени выполнения (прочтите sShortTime, конфигурацию с привязкой к пользователю, настройте правильный порядок полей в фильтре и используйте фильтр для извлечения правильных данных из аргумента).
Я уже упоминал, что ненавижу автоформатирование в этом редакторе? он удаляет пустые строки, а копипаст - это ад.
Надеюсь, это поможет.
+1 для неразрушающего кода, я постараюсь иметь это в виду, когда сам предоставлю примеры кода. Слишком поздно и совершенно не связанное с этим, но 7daysclean.cmd звучит как отличное название для группы Synth-Punk.Скопируйте этот код и сохраните его как DelOldFiles.vbs .
ИСПОЛЬЗОВАНИЕ В CMD: cscript //nologo DelOldFiles.vbs 15
15 означает удаление файлов старше 15 дней назад.
Есть разные версии. Ранние используют параметры стиля unix.
Моя версия (для сервера 2000 - обратите внимание на отсутствие пробелов после переключателей) -
И добавьте его в C: \ WINDOWS \ system32
Это не тот же ответ, синтаксис другой. Это была гениальная попытка помочь. Зная очень мало о командной строке Windows, я потратил часы разочарования, заставляя ее работать. Ключевым моментом в информации для меня был тот факт, что существуют разные версии (с разным синтаксисом), и что мне нужно было удалить пробелы. Ни то, ни другое не было включено в исходный ответ. (Я бы прокомментировал ответ, но у меня нет привилегий Та же ошибка, что и в других ответах (включая принятый). Подстановочный знак *.* в forfiles не соответствует всем файлам. Он сопоставляет только файлы, в именах которых есть . (т. Е. Файлы с расширениями). OP ничего не сказал о требовании . в имени файла. Правильный параметр - /M * , но в любом случае это значение по умолчанию. В /M нет необходимости вообще.IMO, JavaScript постепенно становится универсальным стандартом сценариев: он, вероятно, доступен в большем количестве продуктов, чем любой другой язык сценариев (в Windows он доступен с использованием Windows Scripting Host). Мне нужно очистить старые файлы во многих папках, поэтому вот функция JavaScript для этого:
Чтобы очистить каждую папку, просто добавьте еще один вызов функции clearFolder (). Этот конкретный код также сохраняет файлы exe и dll, а также очищает подпапки.
Как насчет этой модификации 7daysclean.cmd для учета високосного года?
Это можно сделать менее чем за 10 строк кода!
Редактировал Mofi:
Вышеупомянутое условие, созданное J.R., всегда оценивается как false из-за недопустимого синтаксиса.
И Month GEQ 2 также неверно, потому что добавление 86400 секунд для еще одного дня должно производиться в високосном году только для месяцев с марта по декабрь, но не для февраля.
Рабочий код для учета високосного дня - только в текущем году - в пакетном файле 7daysclean.cmd , опубликованном Джей будет:
Могу я добавить скромный вклад в эту уже ценную ветку. Я обнаружил, что другие решения могут избавиться от фактического текста ошибки, но игнорируют% ERRORLEVEL%, который сигнализирует об ошибке в моем приложении. И я законно хочу% ERRORLEVEL%, если это не ошибка «Файлы не найдены».
Некоторые примеры:
Специальная отладка и устранение ошибки:
Использование единственной строки для возврата ERRORLEVEL успеха или неудачи:
Использование единственной строки для поддержания уровня ERRORLEVEL равным нулю для успеха в контексте пакетного файла среди другого кода (ver> nul сбрасывает ERRORLEVEL):
На этапе задания CmdExec агента SQL Server я остановился на следующем. Я не знаю, ошибка ли это, но CmdExec на шаге распознает только первую строку кода:
Если у вас есть комплект ресурсов XP, вы можете использовать robocopy для перемещения всех старых каталогов в один каталог, а затем использовать rmdir для удаления только этого:
Я думаю, что ответ e.James хорош, поскольку он работает с немодифицированными версиями Windows еще в Windows 2000 SP4 (и, возможно, ранее ), но для этого требовалась запись во внешний файл. Вот модифицированная версия, которая не создает внешний текстовый файл при сохранении совместимости:
Чтобы быть верным исходному вопросу, здесь он находится в сценарии, который выполняет ВСЕ математические вычисления за вас, если вы вызываете его с количеством дней в качестве параметра:
ПРИМЕЧАНИЕ. В приведенном выше коде учитываются високосные годы, а также точное количество дней в каждом месяце. Единственный максимум - это общее количество дней, прошедших с 0/0/0 (после этого возвращается отрицательное число лет).
ПРИМЕЧАНИЕ. Математика идет только в одном направлении; он не может правильно получить будущие даты из отрицательного ввода (он попытается, но, скорее всего, пройдет последний день месяца).
В этом нет ничего удивительного, но мне нужно было сделать что-то подобное сегодня и запустить его как запланированную задачу и т. д.
Командный файл DelFilesOlderThanNDays.bat ниже с образцом exec w / params:
DelFilesOlderThanNDays.bat 7 C: \ dir1 \ dir2 \ dir3 \ logs * .log
Расширяя ответ aku, я вижу, что многие люди спрашивают о путях UNC. Простое сопоставление пути unc с буквой диска сделает файлы forfiles счастливыми. Сопоставление и отключение дисков может быть выполнено программно, например, в пакетном файле.
Это приведет к удалению всех файлов с расширением .gz старше 7 дней. Если вы хотите убедиться, что Z: не отображается ни на что другое, перед его использованием вы можете сделать что-нибудь простое, например
Этот сделал это за меня. Он работает с датой, и вы можете вычесть желаемую сумму в годах, чтобы вернуться во времени:
/F в cmd /c del @path /F принудительно удаляет конкретный файл в некоторых случаях, когда файл может быть доступен только для чтения.
dateYear - это переменная года, и вы можете изменить вычитание в соответствии с вашими потребностями.
Очень часто возникают вопросы, связанные с относительной датой / временем, которые нужно решить с помощью командного файла. Но интерпретатор командной строки cmd.exe не имеет функции для вычисления даты / времени. Множество хороших рабочих решений с использованием дополнительных консольных приложений или скриптов уже размещено здесь, на других страницах Stack Overflow и на других веб-сайтах.
Общим для операций, основанных на дате / времени, является требование преобразовать строку даты / времени в секунды с определенного дня. Очень часто бывает 1970-01-01 00:00:00 UTC. Но любой более поздний день также может быть использован в зависимости от диапазона дат, необходимого для поддержки конкретной задачи.
С 20 лет я использую статические таблицы (массивы), созданные один раз с помощью небольшой функции C, для быстрого получения количества дней, включая високосные дни с 1970-01-01, в функциях преобразования даты / времени в моих приложениях, написанных на C / C ++.
Этот очень быстрый табличный метод можно использовать также в пакетном коде с помощью команды FOR . Поэтому я решил закодировать пакетную подпрограмму GetSeconds , которая вычисляет количество секунд с 1970-01-01 00:00:00 UTC для строки даты / времени, переданной в эту процедуру.
Примечание. Дополнительные секунды не учитываются, поскольку файловые системы Windows также не поддерживают дополнительные секунды.
Дни с 1970-01-01 00:00:00 UTC для каждого года, включая високосные дни.
Вычисление секунд для года с 2039 по 2106 с началом эпохи 1970-01-01 возможно только с использованием беззнаковой 32-битной переменной, то есть unsigned long (или unsigned int) в C / C ++.
Информация о високосных годах (нет / да) за 1970–2106 годы.
Количество дней до первого числа каждого месяца в текущем году.
С помощью этих таблиц довольно легко преобразовать дату в количество секунд с 01.01.1970.
Внимание!
Формат строк даты и времени зависит от региона Windows и языковых настроек. Разделители и порядок маркеров, присвоенных переменным среды Day , Month и Year в первом цикле FOR GetSeconds , должны быть адаптированы к местный формат даты / времени, если необходимо.
Необходимо адаптировать строку даты переменной среды, если формат даты в переменной среды ДАТА отличается от формата даты, используемого командой FOR на %%
Например, когда %DATE% заменяется на Sun 02/08/2015 , а %%
tF расширяется до 02/08/2015 07:38 PM , приведенный ниже код можно использовать с изменением строки 4, чтобы:
В результате в подпрограмму передается только 02/08/2015 - строка даты без трех букв аббревиатуры дня недели и разделительного символа пробела.
В качестве альтернативы можно использовать следующее, чтобы передать текущую дату в правильном формате:
Теперь последние 10 символов из строки даты передаются в функцию GetSeconds , и поэтому не имеет значения, является ли строка даты переменной среды DATE с днем недели или без нее, если день и месяц всегда с двумя цифрами в ожидаемом порядке, т. е. в формате dd/mm/yyyy или dd.mm.yyyy .
Вот пакетный код с поясняющими комментариями, который просто выводит, какой файл удалить и какой файл оставить в дереве папок C:\Temp , см. Код первого цикла FOR .
Для оптимальной производительности лучше всего удалить все комментарии, то есть все строки, начинающиеся с rem после 0–4 ведущих пробелов.
Кроме того, приведенный ниже пакетный код оптимизирован для 24-часового формата времени.
Для получения дополнительной информации о форматах даты и времени и сравнении времени файлов в Windows см. Мой ответ на Узнать, если файл старше 4 часов в пакетном режиме файл с большим количеством дополнительной информации о времени файла.
В этом примере он работает, выбирая все файлы (. ) старше 30 дней и перемещая их в целевую папку. Вторая команда делает то же самое снова с добавлением команды PURGE , которая означает удаление файлов в целевой папке, которых нет в исходной папке. По сути, первая команда ПЕРЕМЕЩАЕТ файлы, а вторая УДАЛЯЕТ, потому что они больше не существуют в исходной папке при вызове второй команды.
Обратитесь к документации ROBOCOPY и используйте переключатель / L при тестировании.
Мой скрипт для удаления файлов старше определенного года:
Тебе следует сделать /d -3 (3 днями ранее). Мне это подходит. Таким образом, все сложные партии могут быть выброшены в мусорное ведро. Также forfiles не поддерживает пути UNC, поэтому установите сетевое подключение к определенному диску.
Та же ошибка, что и в других ответах (включая принятый). Откуда взялась эта странная привычка указывать *.* ? Подстановочный знак *.* не соответствует всем файлам в Windows. Он сопоставляет только файлы, в именах которых есть . . OP ничего не сказал о требовании . в имени файла. Правильный параметр - /M * , но в любом случае это значение по умолчанию. В /M нет необходимости вообще. @AnT: Вы уверены? Я думаю, что *.* ведет себя точно так же, как * в Windows. Фактически, я только что попробовал это на своем компьютере, и dir *.* действительно перечислил test file , файл без расширения. Рейбранд: Я тоже нахожу это удивительным, но обработка *.* несовместима, скажем, между dir и -m вариантом forfiles . Маска -m *.* действительно пропускает имена файлов без расширений, как я сказал в своем комментарии выше (попробуйте сами). Забавно то, что в документации MS явно указано, что по умолчанию используется -m *.* . Однако, если вы попробуете это в реальной жизни, вы увидите, что значение по умолчанию на самом деле -m * - все файлы повторяются.Это удаляет файлы старше заданной даты. Я уверен, что его можно изменить, чтобы вернуться на семь дней назад с текущей даты.
update: Я заметил, что HerbCSO улучшил приведенный выше сценарий. Я рекомендую использовать его версию вместо этого.
@PATH - в моем случае это просто путь, поэтому пришлось использовать @PATH\@FILE
Также forfiles /? у меня тоже не работает, но forfiles (без "?") работал нормально.
И единственный у меня вопрос: как добавить несколько масок (например « .log | .bak»)?
Все это касается forfiles.exe, который я скачал здесь (на win XP)
Но если вы используете сервер Windows, forfiles.exe уже должен быть там, и он отличается от версии ftp. Вот почему я должен изменить команду.
Для Windows Server 2003 я использую эту команду:
Для Windows Server 2008 R2:
Это приведет к удалению всех файлов .sql старше 90 дней.
Для Windows 2012 R2 будет работать следующее:
Чтобы увидеть файлы, которые будут удалены, используйте это
Это работает даже в Windows Server 2008 и новее и Windows 7.ROBOCOPY мне отлично подходит. Изначально предложил мой Иман. Но вместо того, чтобы перемещать файлы / папки во временный каталог, а затем удалять содержимое временной папки, переместите файлы в корзину .
Например, это несколько строк моего командного файла резервной копии:
Он очищает все, что старше 15 дней, из моей папки «Temp» и 30 дней для всего, что находится в моей папке резервных копий AutoCAD. Я использую переменные, потому что строка может быть довольно длинной, и я могу повторно использовать их для других мест. Вам просто нужно найти путь к вашей корзине, связанный с вашим логином.
Это у меня на рабочем компьютере, и он работает. Я понимаю, что у некоторых из вас могут быть более ограничительные права, но все равно попробуйте;) Найдите в Google объяснения по параметрам ROBOCOPY.
Читайте также: