Вывести файлы с определенной датой
P < путь >Путь, с которого начинается поиск. По умолчанию используется текущая рабочая папка (.)
/M < маска_поиска >Поиск файлов с помощью маски. Маска поиска по умолчанию "*"
/S Рекурсивное выполнение программы forfiles во всех подпапках, аналогично "DIR /S"
/C < команда >
Команда, которая выполняется для каждого файла. Строки команд необходимо заключать в прямые кавычки. Команда по умолчанию "cmd /c echo @file". Следующие переменные могут использоваться в строке команды:
@file | Возвращает имя файла |
@fname | Возвращает имя файла без расширения |
@ext | Возвращает только расширение имени файла |
@path | Возвращает полный путь к файлу |
@relpath | Возвращает относительный путь к файлу |
@isdir | Возвращает значение "TRUE", если типом файла является папка, и "FALSE" для файлов |
@fsize | Возвращает размер файла в байтах |
@fdate | Возвращает дату последнего изменения файла |
@ftime | Возвращает время последнего изменения файла |
Для включения специальных символов в строку команды следует использовать шестнадцатеричный код символа в формате 0xHH (например, 0x09 для табуляции, 0x22 - двойная кавычка). Перед внутренними командами CMD.exe необходимо ставить "cmd /c".
/D < дата >Выбор файлов, у которых дата последнего изменения больше или равна (+) либо меньше или равна (-) указанной дате при использовании формата "dd.MM.yyyy"; либо файлов, у которых дата последнего изменения больше или равна (+) текущей дате плюс "dd" дней либо меньше или равна (-) текущей дате минус "dd" дней. Допустимым числом дней "dd" является любое число в диапазоне 0 - 32768. "+" используется по умолчанию, если знак не указан.
/? или -? Вывод справки по использованию
Замечания по использованию FORFILES
На что хотелось бы сразу обратить внимание.
Параметр P - это именно путь к обрабатываемым файлам. И нельзя здесь писать по привычке заодно и маску файлов, например /p с:\tmp\*.tmp. Это неправильно! Для маски файлов существует отдельный параметр - M.
И это еще можно было бы понять, если бы в параметре M можно было бы перечислить несколько масок. Так нет же.
И раз уж речь зашла о масках - переменная @ext содержит расширение выбранного файла и может быть использована для обработки.
Как найти и удалить файлы старше конкретной даты в Linux
Хочу в этой теме «Как найти и удалить файлы старше конкретной даты в Linux» рассказать как можно найти и удалить определенные файлы по дате в ОС Linux таких как Debian, Ubuntu или Redhat, Centos. На готовых примера покажу что и как нужно делать.
1. Посмотрим список всех файлов в папке с датой изменения, для этого стоит выполнить команду:
пример использование команды ls -lah для вывода подробной информации о файлах
2. Чтобы узнать сегодняшнюю дату, нужно выполнить:
4. Допустим нужно найти файлы и удалить их по определенной дате.
Если нужно найти все файлы свыше 3 дня и после чего удалить их:
Если нужно найти все файлы свыше 90 дней и после чего удалить их:
Если нужно найти все файлы свыше 365 дней и после чего удалить их:
Если нужно найти все файлы свыше 100 дней и после чего удалить их:
Удаление файлов старше N дней
можно еще вот так:
Ключи:
-name — искать по имени файла, при использовании подстановочных образцов параметр заключается в кавычки.
-type — тип искомого: f=файл, d=каталог, l=ссылка (link).
-user — владелец: имя пользователя или UID.
-group — владелец: группа пользователя или GID.
-perm — указываются права доступа.
-size — размер: указывается в 512-байтных блоках или байтах (признак байтов — символ «c» за числом).
-atime — время последнего обращения к файлу.
-ctime — время последнего изменения владельца или прав доступа к файлу.
-mtime — время последнего изменения файла.
-newer другой_файл — искать файлы созданные позже, чем другой_файл.
-delete — удалять найденные файлы.
-ls — генерирует вывод как команда ls -dgils.
-print — показывает на экране найденные файлы.
-exec command <> \; — выполняет над найденным файлом указанную команду; обратите внимание на синтаксис.
-ok — перед выполнением команды указанной в -exec, выдаёт запрос.
-depth — начинать поиск с самых глубоких уровней вложенности, а не с корня каталога.
-prune — используется, когда вы хотите исключить из поиска определённые каталоги.
N — количество дней.
Примеры
Чтобы отобразить все каталоги, один за другим, в алфавитном порядке, в широком формате и приостановке после каждого экрана, убедитесь, что корневой каталог является текущим каталогом, а затем введите:
В выходных данных перечислены корневой каталог, подкаталоги и файлы в корневом каталоге, включая расширения. Эта команда также перечисляет имена подкаталогов и имена файлов в каждом подкаталоге в дереве.
Чтобы изменить предыдущий пример таким образом, чтобы в dir отображались имена файлов и расширения, но имена каталогов опускались, введите:
Чтобы распечатать список каталогов, введите следующее:
При указании prn список каталогов отправляется на принтер, подключенный к порту LPT1. Если принтер подключен к другому порту, необходимо заменить prn именем правильного порта.
Чтобы отобразить список всех имен файлов с расширением .txt во всех каталогах диска C, введите:
Команда dir отображает в широком формате алфавитный список совпадающих имен файлов в каждом каталоге и приостанавливается каждый раз, когда экран заполняется, пока не нажимаете клавишу, чтобы продолжить.
Подскажите пожалуйста, как реализовать следующую задачу:
Есть сетевое хранилище. В нем куча папок. В данный момент интересуют 5 из них.
4 папки используются для сканов с мфу, то есть пользователь отсканил документ, мфу его положил в свою папку(файлы могут быть как pdf так и jpg, все зависит от того как настроили при сканировании)
В этих 4-х папка не должны оставаться файлы старше 3-х дней. Отсканировал-забрал, не забрал файл удалился.
Нужно, чтоб планировщик запускал bat файл который, из указанной папки все файлы старше трех дней переносил в другую папку, затем из этой "другой папки" удалял все файлы старше 20 дней. При этом в папке могут быть созданы не только файлы с изображениями, так же там могу создать и папку, которую в свою очередь тоже нужно сначала переместить а уже потом удалить с теме же временными рамками что и у файлов. Для этого был написан вот такой батник:
FORFILES /p "W:\Scan_Buh" /S /D -3 /C "cmd /c move @path "W:\EverybodyOld\Scan_Buh\""
:: Переносим все файлы и папки старше 3-х дней из папки Scan_Buh в папку EverybodyOld\Scan_Buh\
FORFILES /p "W:\EverybodyOld\Scan_Buh" /S /D -20 /C "cmd /c del @path /f /q"
:: Удаляем все файлы старше 20-и дней из папки Scan_Buh
FORFILES /p "W:\EverybodyOld\Scan_Buh" /S /C "cmd /c rd @path"
:: Удаляем все пустые папки
FORFILES /p "W:\Scan_Manager" /S /D -3 /C "cmd /c move @path "W:\EverybodyOld\Scan_Manager\""
:: Переносим все файлы и папки старше 3-дней из папки Scan_Manager в папку EverybodyOld\Scan_Manager\
FORFILES /p "W:\EverybodyOld\Scan_Manager" /S /D -20 /C "cmd /c del @path /f /q"
:: Удаляем все файлы старше 20-и дней из папки Scan_Manager
FORFILES /p "W:\EverybodyOld\Scan_Manager" /S /C "cmd /c rd @path"
:: Удаляем все пустые папки
Аналогично для остальных двух папок, меняется только путь к ним.
Сейчас добавилась еще одна папка. В ней идет обмен документами, а так же несколько папок с которыми работают все. Тут может быть куча самых различных фалов, папок, подпапок. Из этой папке так же нужно перемещать все файлы\папки старше n дней в другую папку, затем по истечение n дней удалять из другой папки. НО есть несколько папок (в них соответственно файлы) которые трогать не нужно. К примеру есть w:\test в ней еще папки 1,2,3,4,5,6, и просто фалы лежащие в корне(кол-во файлов и папок может быть какое угодно и с каким угодно расширением), нужно чтоб всё что старше n дней переместилось в w:\arhiv\test кроме папки и всего содержимого в папка 2, 4,5 эти папки просто должны пропускаться (у них есть имя которое не изменяется, ведется работа только внутри этих папок) а потом уже из папки w:\arhiv\test так же все что старше 20 дней удалялось и файлы и папки в том числе.
Как сделать исключение по названию папки? Чтоб при том же перемещении на определенную папку просто не обращалось внимания.
У Forfiles есть ключ /м но это маска с которой он работает и не исключает.
Все это на автомате, без каких либо запросов и ввода доп информации, задание ночью отработало и всё.
Помогите разобраться и дополнить батник, а возможно и переделать совсем и оптимизировать.
дополнить батник, а возможно и переделать совсем и оптимизировать. |
Я бы предложил не копировать исходные файлы старше нужного числа дней как они есть, а архивировать в архив в один файл с именем - датой в формате yyyymmdd, с такими названиями файлы легко сортируются. При этом используя ключи winrar этого можно легко добиться. И, далее, удалять в архивной папке не файлы старше определённой даты (например, 20 дней), а оставлять нужное число архивов (например, 20 штук), что, в принципе, при ежедневном создании архивов, одно и то же. Получилось громоздко, но довольно универсально. Степень сжатия rar можно регулировать при необходимости экономии времени при работе ключом -m. В примере я взял -m1 (довольно быстрая работа). Еще быстрее -m0 без сжатия. Без указания работает уровень m3.
Процедура архивации Call :Arc_Copy вызывается для каждой архивируемой папки.
Её аргументы описаны.
При наличии исключений в аргументах этой процедуры указывается имя процедуры, где формируется текстовый файл для конкретного случая с перечислением полных имён папок (файлов) исключений.
В примере это процедуры No_JS_Host и No_test
-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.
Примеры использования FORFILES
В простых случаях использование FORFILES дает мало преимуществ по сравнению с командой dir.
В следующем примере будут выведены все поддиректории, начиная с определенной в параметре P.
Учитывая некоторую . нестандартность параметров команды FORFILES, на мой взгляд, в простых случаях лучше использовать команду dir. По крайней мере, привычнее.
Наиболее часто используемый случай для команды FORFILES- удаление ( реже - копирование, перемещение ) файлов старше определенной даты.
Так же просто решается задача обработки файлов, старше определенного количества дней.
В приведенном выше примере все файлы текущей папки дата создания (изменения) которых больше 30 дней переносятся в архив.
Как вариант - обработка файлов с текущей датой создания (изменения).
Следующая популярная область применения FORFILES - обработка файлов в зависимости от их размера.
Не бесполезный пример. Позволяет провести аудит диска на предмет наличия "больших" файлов.
И еще один пример - поиск "маленьких" файлов, как вариант - нулевой длины.
FORFILES /P "%USERPROFILE%\Local Settings\Temporary Internet Files\Content.IE5" /S /C "cmd /c if @isdir==FALSE if @fsize == 0 del @path /q"
В приведенном выше примере использования FORFILES из папок временных файлов Internet Explorer удаляются файлы нулевой длины.
Если вы пользуетесь этим браузером и редко чистите кэш, то таких ненужных файлов там немало.
На основе предыдущих примеров использования FORFILES без труда можно написать пример очистки и от "старых" файлов, но корректнее это делать соответствующей оснасткой.
В качестве исполняемой команды допустимо использовать внешний bat файл, которому FORFILES может передавать параметры.
Так, в следующем примере для файлов с текущей датой создания (изменения) вызывается bat файл 1.bat, которому в качестве параметра передается имя файла. Т. е. 1.bat будет вызван столько раз, сколько найдется файлов, удовлетворяющих условию.
Несмотря на то, что такое использование может значительно расширять возможности FORFILES, использовать такой прием следует с осторожностью, так как это может значительно увеличить время обработки.
Несколько экзотический пример использование FORFILES. Просто показать возможности этой команды.
Мы рассмотрели примеры использования FORFILES.
На мой взгляд, несмотря на некоторую необычность параметров, эта команда стоит того, что бы уделить ей внимание.
Для вопросов, обсуждений, замечаний, предложений и т. п. можете использовать раздел форума этого сайта (требуется регистрация).
Новый раздел о средствах командной строки в рамках этого же проекта расположен здесь
Выбирает и выполняет команду для файла или набора файлов. Эта команда чаще всего используется в пакетных файлах.
Параметры
- d — каталоги
- h — скрытые файлы
- s — системные файлы
- l — точки повторного анализа
- r — файлы только для чтения
- a . Файлы, готовые к архивации
- i — не индексированные файлы содержимого
- n — по алфавиту по имени
- e — по алфавиту по расширению
- g — сначала группировать каталоги
- s — по размеру, наименьший первый
- d — по дате и времени, самым старым первым
- - Используйте префикс для отмены порядка сортировки
- c — создание
- a - Последний доступ
- w — последняя запись
Комментарии
Чтобы использовать несколько параметров имени файла , разделите каждое имя файла пробелом, запятой или точкой с запятой.
С помощью подстановочных знаков (* или ?) можно представить один или несколько символов имени файла и отобразить подмножество файлов или подкаталогов.
Можно использовать подстановочный знак, *чтобы заменить любую строку символов, например:
dir *.txt выводит список всех файлов в текущем каталоге с расширениями, начинающимися с .txt, таких как .txt, TXT1, .txt_old.
dir read *.txt выводит список всех файлов в текущем каталоге, которые начинаются с чтения и с расширений, которые начинаются с .txt, таких как .txt, TXT1 или .txt_old.
dir read *.* выводит список всех файлов в текущем каталоге, которые начинаются с чтения с любого расширения.
Подстановочный знак звездочки всегда использует краткое сопоставление имен файлов, поэтому вы можете получить непредвиденные результаты. Например, следующий каталог содержит два файла (t.txt2 и t97.txt):
Вы можете ожидать, что ввод dir t97\* вернет файл t97.txt. Однако при вводе dir t97\* возвращаются оба файла, так как подстановочный знак звездочки соответствует файлу t.txt2 для t97.txt с помощью его карты короткого имени T97B4~1.TXT. Аналогично ввод приведет к удалению del t97\* обоих файлов.
Вопросительный знак (?) можно использовать в качестве замены одного символа в имени. Например, при вводе dir read. txt списка всех файлов в текущем каталоге с расширением .txt, начинающимся с чтения и за которым следует до трех символов. Сюда входят Read.txt, Read1.txt, Read12.txt, Read123.txt и Readme1.txt, но не Readme12.txt.
При использовании /a с несколькими значениями в атрибутах эта команда отображает имена только этих файлов со всеми указанными атрибутами. Например, при использовании /a с r и -h в качестве атрибутов (с помощью /a:r-h одного или /ar-h ) эта команда будет отображать только имена файлов, доступных только для чтения, которые не скрыты.
Если указать несколько значений sortorder , эта команда сортирует имена файлов по первому критерию, а затем по второму критерию и т. д. Например, если вы используете /o с параметрами e и -s для сортировки (с помощью одного /o:e-s или) /oe-s эта команда сортирует имена каталогов и файлов по расширению с наибольшим первым, а затем отображает конечный результат. Сортировка по алфавиту приводит к тому, что имена файлов без расширений отображаются сначала, а затем имена каталогов, а затем имена файлов с расширениями.
При использовании символа перенаправления ( > ) для отправки выходных данных этой команды в файл или при использовании канала ( | ) для отправки выходных данных этой команды в другую команду необходимо использовать /a:-d и /b , чтобы вывести только имена файлов. Вы можете использовать имя файла с параметром /b и /s , чтобы указать, что эта команда заключается в поиске текущего каталога и его подкаталогов для всех имен файлов, соответствующих имени файла. Эта команда содержит только букву диска, имя каталога, имя файла и расширение имени файла (один путь на строку) для каждого найденного имени файла. Прежде чем использовать канал для отправки выходных данных этой команды в другую команду, необходимо задать переменную среды TEMP в файле Autoexec.nt.
Синтаксис
Параметры
- Выбирает файлы с датой последнего изменения позже или равным ( + ) или ранее или равной ( - ) указанной даты, где + соответствует формату mm/дд/гггг.
- Выбирает файлы с датой последнего изменения позже или равным ( + ) текущей датой плюс указанное число дней, а также до или менее ( - ) текущей датой минус указанное число дней.
- Допустимые значения дней включают любое число в диапазоне от 0 до 32768. Если знак не указан, + по умолчанию используется.
Комментарии
forfiles /S Команда аналогична dir /S .
В командной строке можно использовать следующие переменные, как указано в параметре командной строки /c :
Команда forfiles позволяет выполнять команду или передавать аргументы в несколько файлов. Например, можно выполнить команду Type для всех файлов в дереве с расширением имени файла .txt. Также можно выполнить каждый пакетный файл (* .bat) на диске C с именем файла Myinput.txt в качестве первого аргумента.
Эта команда может:
Выберите файлы в абсолютную или относительную дату с помощью параметра /d .
Создайте архивное дерево файлов с помощью переменных, таких как @FSIZE и @FDATE .
С помощью @ISDIR переменной можно отличать файлы от каталогов.
Включите специальные символы в командную строку, используя шестнадцатеричный код для символа в формате 0xчч (например, 0x09 для вкладки).
Эта команда работает путем применения recurse subdirectories флага к средствам, предназначенным для обработки только одного файла.
Примеры
Чтобы вывести список всех пакетных файлов на диске C, введите:
Чтобы вывести список всех каталогов на диске C, введите:
Чтобы получить список всех файлов в текущем каталоге, которые устарели по крайней мере один год, введите:
Чтобы отобразить текстовый файл , устаревший для каждого из файлов в текущем каталоге, которые старше 1 января 2007, введите:
Чтобы вывести список расширений имен файлов в текущем каталоге в формате столбца и добавить вкладку перед расширением, введите:
Отображает список файлов и подкаталогов каталога. При использовании без параметров эта команда отображает метку тома диска и серийный номер, а затем список каталогов и файлов на диске (включая их имена и дату и время последнего изменения). Для файлов эта команда отображает расширение имени и размер в байтах. Эта команда также отображает общее количество файлов и каталогов, их совокупный размер и свободное пространство (в байтах), оставшееся на диске.
Команда dir также может выполняться из консоли восстановления Windows с использованием различных параметров. Дополнительные сведения см. в разделе Windows Среда восстановления (WinRE).
Синтаксис
Замечания по использованию FORFILES
На что хотелось бы сразу обратить внимание.
Параметр P - это именно путь к обрабатываемым файлам. И нельзя здесь писать по привычке заодно и маску файлов, например /p с:\tmp\*.tmp. Это неправильно! Для маски файлов существует отдельный параметр - M.
И это еще можно было бы понять, если бы в параметре M можно было бы перечислить несколько масок. Так нет же.
И раз уж речь зашла о масках - переменная @ext содержит расширение выбранного файла и может быть использована для обработки.
Читайте также: