PDA

Показать полную графическую версию : BAT-скрипт удаления файлов


Страниц : [1] 2

Stolc
19-12-2018, 11:52
Привет!
В папке находится 60 тыс файлов. У всех название сформировано по маске _дата_название_id.jpg Например, _20181212_розы_544.jpg.
И есть файл со значениями id для удаления. Эти id в файле расположены в столбец, один id на одну строку.
Как сделать скрипт, который удалял бы все файлы, в названии которых есть id, указанный в файле?
Или это только отдельную прогу писать?

Busla
19-12-2018, 12:09
echo off
for /f "usebackq delims=" %%i in ("C:\list.txt") do dir /B *_%%i.jpg
выводит список файлов, для удаления - заменить dir /B на del

alpap
19-12-2018, 14:25
Busla, Stolc,
под один код много чего попадет, ведь код один и тот же может быть у многих файлов, точно дата или имя не будут играть роли?
155566

Busla
19-12-2018, 20:25
alpap, id - сокращение от identificator
и по формулировке самой задачи видно что под id подразумевается идентификатор

alpap
19-12-2018, 22:58
под id подразумевается идентификатор »
да понятно это все и я ничего не имею против, только ТС иногда поздно вспоминают что не совсем четко описали условие задачи, поэтому на скрине специально привел возможные варианты из которых точно можно сказать так надо или дополнительно, например, в рамках одной даты.

engeltud
21-05-2021, 12:57
Может кто-то и поможет с написанием скрипта...
Задача следущая:

Есть в папке файлы с названиями типа: имя_rabota+два числа.jpg

mama_myla_ramu_rabota01.jpg, mama_myla_ramu_rabota02.jpg, mama_myla_ramu_rabota03.jpg
papa_rubil_drova_rabota01.jpg, papa_rubil_drova_rabota02.jpg
syn_spal_doma_rabota01.jpg

Результат: после удаления должен остатся файл с найбольшим числом в конце в своей группе:

mama_myla_ramu_rabota03.jpg, papa_rubil_drova_rabota02.jpg, syn_spal_doma_rabota01.jpg

и ещё последний файл в своей группе отличается существенно в своем размере от других. Может как-то ещё поможет в сортировке и удалении.

DJ Mogarych
21-05-2021, 13:16
отличается существенно в своем размере от других »
В какую сторону?

engeltud
21-05-2021, 13:34
в большую, но лучше удалять по названию. Если есть возможность, тогда два отдельных скриптa по двум признакам. Я думаю, что удаление за признаком размера будет сложнее чем по названию.

DJ Mogarych
21-05-2021, 13:45
Powershell

cd D:\temp\test

# По имени
(dir).BaseName -replace "\d{2}$" |sort -Unique |% {dir -filter "*$_*" |select -SkipLast 1 |del -WhatIf}
# По размеру
(dir).BaseName -replace "\d{2}$" |sort -Unique |% {dir -filter "*$_*" |sort length |select -SkipLast 1 |del -WhatIf}

megaloman
21-05-2021, 16:15
CMD по имени@Echo Off
cls
Set "BoxIn=Z:\Box_In"
Set "Find=^.*[0-9][0-9]\.jpg$"

For /f "usebackq delims=" %%f In (`2^>nul Dir /B /A:-D /O:-N "%BoxIn%\*.*" ^| findstr.exe /R /I /C:"%Find%"`) Do (
If Exist "%BoxIn%\%%f" (
Set "Name=%%~nf"
For /f "usebackq skip=1 delims=" %%i In (`2^>nul Call Dir /B /A:-D /O:-N "%BoxIn%\%%Name:~0,-2%%*.*" ^| findstr.exe /R /I /C:"%Find%"`) Do Del "%BoxIn%\%%i"
)
)
pause
Exit /B

Если по размеру, заменить /O:-N на /O:-S
во втором For

ShaddyR
06-07-2021, 15:16
слегка вклинюсь: меня тут реакция командного процессора M$ на простую задачу ввела в задумчивость. А именно: попросил зачистить темповские хвосты от rar'а, вида __rar_<цифры>.<цифры>, на всём диске, где намусорил, собака. Ничтоже сумняшеся, дал команду
del x: /f /s /q "__rar_*"
Побёг лог убиваемого, который мне намекнул на то, что на самом деле всё совсем не так, как в реальности: эта дура стала сносить всё подряд, вне зависимости от типа, пути и имени файла. Вопрос: WHY???
ЗЫ: несмертельно, заодно увидел пару лишних папок в логе, приберу с архива, но по факту - непонятно.

iglezz
06-07-2021, 19:36
ShaddyR, Вопрос: WHY??? »
Опечатка с потерянным x:?
Команда del x: /f /s /q "__rar_*" удалит сначала X:, затем "__rar_*". Для сей команды порядок ключей и имён/масок файлов/каталогов не важен.

greg zakharov
06-07-2021, 21:15
У ShaddyR подпись нужно сменить на "Кирпичных Дел Мастер".

ShaddyR
07-07-2021, 01:59
Опечатка с потерянным x:? »
то бишь, "x:\__rar_*" ?
Тоже не вяжется:
Команда del x: /f /s /q "__rar_*" удалит сначала X: »
что невозможно по определению, не так ли? А вот дальше - см. п.1 -
Побёг лог убиваемого, который мне намекнул на то, что на самом деле всё совсем не так, как в реальности: эта дура стала сносить всё подряд, вне зависимости от типа, пути и имени файла. »
Повторюсь еще раз: в имени убитых файлов не было ни намёка на ни на rar, ни на __ и уж никак не на какие-либо их совмещения. Эта команда НЕ ДОЛЖНА БЫЛА убить ничего лишнего, вот в чем соль. Иначе - обоснуй, где я свернул в нетуда.
>
Захаров, тебе лично могу организовать юбилейную подарочную перманентную подпись БАЛАБОЛ. Не желаешь? Есть что по сути сказать?

Iska
07-07-2021, 04:42
ShaddyR, это не так работает.

1. Команда del принимает в качестве аргументов множественные имена файлов/масок:
Удаление одного или нескольких файлов.

DEL [/P] [/F] [/S] [/Q] [/A[[:]атрибуты]] имена
ERASE [/P] [/F] [/S] [/Q] [/A[[:]атрибуты]] имена

имена Список из одного или нескольких файлов или каталогов.
Для удаления группы файлов можно использовать подстановочные
знаки. Если указан каталог, будут удалены все файлы в этом
каталоге.

/P Запрос подтверждения перед удалением каждого файла.
/F Принудительное удаление файлов, доступных только для чтения.
/S Удаление указанных файлов из всех подкаталогов.
/Q Отключение запроса на подтверждение при удалении файлов.
/A Отбор файлов для удаления по атрибутам.
атрибуты R Файлы, доступные только для чтения.
S Системные файлы.
H Скрытые файлы.
A Файлы, готовые для архивирования.
I Файлы с неиндексированным содержимым.
L Точки повторной обработки.
- Префикс "-" имеет значение НЕ.

Изменение команд DEL и ERASE при включении расширенной обработки команд:

Результаты вывода для ключа /S принимают обратный характер, то есть выводятся
только имена удаленных файлов, а не файлов, которые не удалось найти.
В указанном примере таких аргументов два: «x:» и «"__rar_*"».

2. «x:» в данном контексте означает: «все файлы текущего каталога диска x:», поскольку, коль ни имя файла, ни маска файлов не заданы — к пути «x:» применяется умолчальная маска «*.*». Если специально текущий каталог для диска не менялся — им будет по умолчанию корневой каталог. Отсюда — фактически применяется такое: «x:\*.*».

3. И токмо опосля пытается найти и удалить файлы по маске «__rar_*» в текущем каталоге текущего диска.

В общем, как всегда: умолчания — зло.

greg zakharov
07-07-2021, 09:03
Есть что по сути сказать?По сути:
1.настоящий мастер не станет заниматься копипастом кода, не осмыслив его содержимое, а значит не будет постить сообщения подобные этому:эта дура стала сносить всё подряд, вне зависимости от типа, пути и имени файла. Вопрос: WHY???
2.отрицание вами объективного (см. аргумент выше) укажет лишь на ограниченность (вашу)
3.отсутствие самоиронии (и как следствие, чувство юмора) обычно указывает на озлобленность человека (главным образом из-за жизненных неудач)
4.злоупотребление положением модератора, в частности угрозы организовать юбилейную подарочную перманентную подпись БАЛАБОЛлишь дополняют аргументацию не в вашу пользу

YuS_2
07-07-2021, 09:11
2. «x:» в данном контексте означает: «все файлы текущего каталога диска x:», поскольку, коль ни имя файла, ни маска файлов не заданы — к пути «x:» применяется умолчальная маска «*.*». Если специально текущий каталог для диска не менялся — им будет по умолчанию корневой каталог. Отсюда — фактически применяется такое: «x:\*.*».
3. И токмо опосля пытается найти и удалить файлы по маске «__rar_*» в текущем каталоге текущего диска.
В общем, как всегда: умолчания — зло.»
Следует ещё добавить, что в таких случаях, когда используются маски типа "x:" (а это именно маска, т.к. отсутствует конкретное имя и подставляется "x:\*.*"), ключ /s (рекурсия), вообще вселенское зло, т.к. команда DEL с таким набором ключей, будет почти аналогичной "format x:"... :)

ShaddyR
09-07-2021, 01:50
В общем, как всегда: умолчания — зло. »
когда используются маски типа "x:" (а это именно маска, т.к. отсутствует конкретное имя и подставляется "x:\*.*"), »
да какой же ебил решил, что если я не указал маску - значит, ее надо придумать за меня? Я же ему сказал дословно "где" и "что именно", сфигали лезть интеллект проявлять? Понял, спасибо, буду внимательнее читать хелп. В любом случае, инцидент много о чем напомнил и был даже весьма полезен, как я и написал выше.
>
Захаров, строить из себя психолога будешь в другом месте, здесь ни конференция вообще, ни раздел или тема в частности не подходят. Остальные инсинуации - следствие твоей (само)уверенности в том, что ты что-то знаешь обо мне и много о людях. В двух словах - вообще мимо, во всех "аргументах". Почему - можешь попробовать применить свою аналитику на себя - может, чего узнаешь нового. Это же касается и вымышленной "угрозы" - перечитай это сообщение заново, оно содержит ответ и на этот "вопрос". Если желаешь поспорить и доказать, как ты немеряно крут в понимании других - ЛС к твоим услугам, там же я тебе все расскажу более подробно... если захочешь ;)

Iska
09-07-2021, 06:20
ShaddyR, в любом случае, это было ещё до MS DOS.

YuS_2
09-07-2021, 09:19
да какой же ебил решил, что если я не указал маску - значит, ее надо придумать за меня? »
Хоть я и ругаю иногда микрософт за его недосмотры, но в данном случае, возможно, я сам выразился недостаточно верно.
Если заглянуть в хелп, там указано:
имена Список из одного или нескольких файлов или каталогов.
Для удаления группы файлов можно использовать подстановочные
знаки. Если указан каталог, будут удалены все файлы в этом
каталоге.
То бишь, в данном случае, x: - это каталог (ну или иначе - диск с корневым каталогом, согласно синтаксису CMD), а ключ /s - рекурсия, т.е. скрипт выполняет вполне то, что ему указано, несмотря на имя "__rar_*", которое для скрипта не является именем файла, это может быть и каталог, и файл. Т.о. для него, это два имени "x:" и "__rar_*", которые он и обрабатывает.
В общем, переходите на powershell, для таких задач он более вменяем, с точки зрения конкретных настроек и кроме того, существует возможность везде явно отделять каталоги от файлов.




© OSzone.net 2001-2012