Forfiles - консольная утилита Windows для операций с файлами, которая уже присутствует в стандартной поставке в Windows7 и WS2008R2. Позволяет производить поиск по маске и\или возрасту и применять действия к найденным файлам.
Например, данная команда найдет и удалит все файлы по маске *.log старше месяца:
forfiles /P D:\logs /S /D 30 /M *.log /С "cmd /C del @file" >> log.txt
Где:
/P D:\logs
- путь
/S
- рекурсивно
/D 30
- по дате, старше 30 дней
/M *.log
- маска поиска
/С cmd
- вызов командной строки
/C del
- вызов команды удалить
@file
- возвращает имена найденных файлов
>> log.txt
- перенаправить вывод команды в лог файл
Можно сохранить как батник и запихать в крон планировщик задач.
Пара примеров:
Удалить файлы в каталогах по маске .svn
по пути D:\project\, оставив сами каталоги:
forfiles /P D:\project\ /S /M .svn -c "cmd /c del /S @file"
Удалить непустые каталоги по маске .svn
со всем содержимым:
forfiles /P D:\project\ /S /M .svn -c "cmd /c rmdir /S @file"
Справка по использованию:
forfiles /? FORFILES [/P < путь>] [/M < маска_поиска>] [/S] [/C < команда>] [/D [+ | -] {dd.MM.yyyy | dd}] Описание. Выбор файла (или набора файлов) и выполнение команды с этим файлом. Программа полезна для пакетных заданий. Параметры: /P < путь> Путь, с которого начинается поиск. По умолчанию используется текущая рабочая папка (.). /M < маска_поиска> Поиск файлов с помощью маски. Маска поиска по умолчанию "*" . /S Рекурсивное выполнение программы forfiles во всех подпапках, аналогично "DIR /S". /C < команда> Команда, которая выполняется для каждого файла. Строки команд необходимо заключать в прямые кавычки. Команда по умолчанию "cmd /c echo @file". Следующие переменные могут использоваться в строке команды: @file - возвращает имя файла. @fname - возвращает имя файла без расширения. @ext - возвращает только расширение имени файла. @path - возвращает полный путь к файлу. @relpath - возвращает относительный путь к файлу. @isdir - возвращает значение "TRUE", если типом файла является папка, и "FALSE" для файлов. @fsize - возвращает размер файла в байтах. @fdate - возвращает дату последнего изменения файла. @ftime - возвращает время последнего изменения файла. Для включения специальных символов в строку команды следует использовать шестнадцатеричный код символа в формате 0xHH (например, 0x09 для табуляции). Перед внутренними командами CMD.exe необходимо ставить "cmd /c". /D < дата> Выбор файлов, у которых дата последнего изменения больше или равна (+) либо меньше или равна (-) указанной дате при использовании формата "dd.MM.yyyy"; либо файлов, у которых дата последнего изменения больше или равна (+) текущей дате плюс "dd" дней либо меньше или равна (-) текущей дате минус "dd" дней. Допустимым числом дней "dd" является любое число в диапазоне 0 - 32768. "+" используется по умолчанию, если знак не указан. /? Вывод справки по использованию. Примеры: FORFILES /? FORFILES FORFILES /P C:\WINDOWS /S /M DNS*.* FORFILES /S /M *.txt /C "cmd /c type @file | more" FORFILES /P C:\ /S /M *.bat FORFILES /D -30 /M *.exe /C "cmd /c echo @path 0x09 был изменен 30 дней назад" FORFILES /D 01.01.2001 /C "cmd /c echo @fname является новым с 1-янв-2001" FORFILES /D +18.10.2013 /C "cmd /c echo @fname является новым сегодня" FORFILES /M *.exe /D +1 FORFILES /S /M *.doc /C "cmd /c echo @fsize" FORFILES /M *.txt /C "cmd /c if @isdir==FALSE notepad.exe @file"
Если выдает такую ошибку (для разных языков):
ОШИБКА: Неправильный параметр или аргумент - '/С'. ERROR: Invalid syntax. Value expected for '/C'.
Значит параметр /C
не срабатывает, помогает замена на -С
, как сделано в паре примеров.
Как выяснилось, в WS2003R2 (предполагаю что на WXP тоже) срабатывают оба параметра, а в WS2008R2 и W7 только -С
.
Привелось удалять логи из каталога c:\ProgramData\Path
и на выполнение действия для каждого вложенного каталога просил подтверждения. Параметра /f
- force
для forfiles нет. Пришлось сделать так:
echo Y | forfiles /P c:\ProgramData\Path /S /D -21 /c "cmd /c del /s @file"