Показать полную графическую версию : [решено] удалить файлы по маске *_i.ext
shadowbat
03-01-2015, 19:13
Здравствуйте!
помогите удалить файлы
пользователем задается например i1=2 i2=3
маска в виде "_i.Extension"
и батник должен удалить все файлы в папке с хвостиком от 2 до 3
http://s008.radikal.ru/i305/1501/9a/d8f253843829.jpg
shadowbat, не совсем понятно что вам нужно.
Что такое i1=2 i2=3?
Какая операционка?
От имени администратора
del \путь к папке\*_*.txt
del \путь к папке\*_*.jpg
и так далее. Зачем огород городить. Всё легко и просто через bat, cmd.
Или так
del \путь к папке\file*_*.txt
shadowbat
03-01-2015, 21:23
i1=2 i2=3 - задается в начале бат файла два значения. например одно значение "2", второе значение "3"
бат удаляет все файлы по маске *_i.extension, где i в цикле сменяется с "2" до "3" с шагом 1
например есть сто разных имён с хвостиками от _0 до _5 (в сумме 600 разных файлов). нужно удалить все файлы с хвостиками от 2 до 3, чтобы остались хвостики 0,1,4,5, неважно какое там расширение (в сумме из 600 останется 400 файлов)
похожий пример и показан на картинке в первом сообщении, в котором удаляются все файлы с хвостиками от "_2" до "_3"
операционка Windows...
del \путь к папке\*_*.txt слишком топорно перебирать все существующие расширения вручную
так можно дойти до
del \путь к папке\*_2.txt
del \путь к папке\*_2.jpg
del \путь к папке\*_2.doc
del \путь к папке\*_3.txt
del \путь к папке\*_3.jpg
del \путь к папке\*_3.doc
и еще сто похожих строк
слишком топорно перебирать все существующие расширения вручную »
А звёздочку уже отменили *
так можно дойти до »
А так в батник запихнуть две строчки не судьба?
del \путь к папке\*_2.*
del \путь к папке\*_3.*
@echo off& setlocal enableextensions
set /a i1=2,i2=3
set "mask=_i.*"
for /l %%i in (%i1% 1 %i2%) do cmd /v:on /c del "*!mask:i=%%i!"
endlocal& exit /b
shadowbat
03-01-2015, 21:57
А так в батник запихнуть две строчки не судьба?
а если нужно удалить файлы с хвостиками от "2" до "30", то 29 строчек вписывать?
можно и вручную через поиск в експлорере ввести "_2." и удалить мышкой. зачем тогда тему создавать?
Georgio
спасибо огромное, все работает!
shadowbat
03-01-2015, 22:31
а можно как то изменить, чтобы удалял не по маске *_i.*, а по маске *_i.extension ?
чтобы не удалял файлы типа file_1.file_0.jpg (если в i от 1 до 3, то он не должен этот файл удалять, а он удаляет)
то есть если такая маска попадется случайно в середине имени файла
@echo off& setlocal enableextensions
set /a i1=2,i2=3
set "mask=_i.*"
for /l %%i in (%i1% 1 %i2%) do (
for /f "delims=" %%j in ('
cmd /v:on /c dir /a-d/b "*!mask:i=%%i!"^| findstr /rc:"%mask:i.=[0-9][0-9]*\.[^\.][^\.]%$"
') do del "%%j"
)
endlocal& exit /b
shadowbat
04-01-2015, 08:20
спасибо
может я что то не так делаю или объясняю, но удалился файл, у которого в середине есть _2., хотя в конце _0
http://s58.radikal.ru/i162/1501/a3/d0c8efd810e6.jpg
shadowbat
04-01-2015, 10:53
можно упростить и делать проверку просто на последний символ в имени файла
если он равен от 2 до 3 с шагом 1, то удалять файл
например если есть File1.jpg File2.txt File3.jpg, то удалить файлы File2.txt и File3.jpg
так наверное будет проще?
shadowbat
04-01-2015, 14:44
а что в cmd/bat нет команды поиска справа налево или обрезка строки?
я вчера на vba за 15 минут это сделал. там же делов на две строчки.
обрезать имя файла справа до точки и сверить последний символ в имени с i
если совпадает, то удалить файл
можно даже без проверки на наличие "_" во втором символе с конца имени файла
ведь по маске можно застрять в середине имени. а так можно сразу сверять по крайнему символу справа
задание же простое. тем более для местных профи по cmd/bat
аналогично и для второй темы, в которой портянки тоже огромные такие
key = Left(FileName, (InStrRev(FileName, ".")) - 2) & i & "." 'имя до расширения
ext = Right(FileName, Len(FileName) - InStrRev(FileName, ".")) 'расширение
итого на строке Fil eNa me_0.extension
выдает
key = Fil eNa me_i.
ext = extension
потом сверяется по key & ext и обрабатывается файл
только вот cmd/bat я не так хорошо знаю, хотя особенного тут совсем нет ничего же
либо поиск справа налево точки в имени файла либо обрезка имени файла по одному символу пока этим символом не будет точка
а дальше находим крайний символ и по нему сверяем. как сделать хотя бы так топорно?
а что в cmd/bat нет команды поиска справа налево »
Вообще. Ни справа налево, ни слева направо.
или обрезка строки? »
Нет. Есть выделение подстроки и замена подстроки. «set /?» в помощь.
я вчера на vba за 15 минут это сделал. там же делов на две строчки. »
Значит, Вам понравится Windows PowerShell, который пришёл на смену пакетным файлам и скриптам Windows Script Host. «Там же делов» на одну строчку. Дерзайте.
Не забудьте только предварительно составить полный и корректный алгоритм, чтобы после очередной итерации внезапно не «вылезало» очередное позабытое требование.
shadowbat
04-01-2015, 15:11
Ни справа налево, ни слева направо.
да, тогда сложнее конечно.
Значит, Вам понравится Windows PowerShell
вопрос же не в том, что нравится или не нравится.
нужно было сделать обычный "простенький" батник, чтобы обычные другие люди могли удалить все файлы с ненужными хвостиками
а тут оказывается это никак не сделать, если в имени файла есть повторяющиеся символы
может их можно как то посчитать? например считает количество _ и ищет файлы по маске *_*_*_i.* (например если в файле три подчеркивания)
или заменить все _ на ! кроме последнего. тогда маска _i.* будет приводить всегда в одно и то же место в имени файла, потому что символ _ будет только один
получается четко такую задачу на cmd/bat не сделать и лучше делать это на vbs?
я правильно понимаю, что если подобную задачу делать на cmd/bat, то нужно:
1. либо мириться с тем, что в имени файла должен быть один ключевой символ
2. либо в данном конкретном случае если указать маску *_[0-9].ext , где ext = например перебор txt, png, jpg - то будет сверяться именно та цифра перед расширением ?
ведь если есть имя файла Fi_1.le_0.txt , то маска *_[0-9].ext выявит одно конкретное место, несмотря на два символа _ ?
если вторая идея верная, то как можно добавить цикл перебора маски _[0-9].txt, _[0-9].jpg, _[0-9].png ?
shadowbat, чтобы сделать любое: что пакетный файл, что скрипт WSH, або PowerShell — нужно с точностью описать алгоритм. Или хотя бы точное ТЗ. Желательно целиком и сразу. У Вас этого нет.
В большинстве случаев на маски вообще не рекомендую закладываться, поскольку можно очень хорошо «попасть». Один вариант Вы уже сами видели (http://forum.oszone.net/post-2451502.html#post2451502). Другой — при наличии в маске латиницы, а в перечне файлов — кириллицы.
получается четко такую задачу на cmd/bat не сделать »
Попробуйте так:
@echo off
setlocal enableextensions enabledelayedexpansion
set /a iStart = 2
set /a iFinish = 3
for /f "usebackq delims=" %%i in (`2^>nul dir /b /a:-d "*.*"`) do (
set sName=%%~ni
set sExt=%%~xi
for /l %%j in (%iStart%, 1, %iFinish%) do for /f "usebackq delims=" %%k in (
`echo !sName!^|findstr.exe "^.*_%%j$"`
) do echo del "%%~k!sExt!"
)
endlocal
exit /b 0
Update: Ах, да, совсем забыл написать — для реального удаления уберите «echo».
shadowbat
04-01-2015, 17:57
Или хотя бы точное ТЗ. Желательно целиком и сразу. У Вас этого нет.
ТЗ не менялось на протяжении всей темы. была дана маска "_i.Extension"
да, я не написал "с учетом если в имени файла есть символы "_", пробелы, кириллица, иероглифы"
этого уточнения не было, потому что я и сам не знал, что с обработкой строк в cmd есть некоторые проблемы и нельзя, чтобы дублировался знак "_" в имени в данном случае
может быть ТЗ не было описано достаточно понятно в первом сообщении
Попробуйте так:
спасибо! , всё удаляется верно согласно хвостику (и с пробелами в имени файла, и с кириллицей и с иероглифами и с несколькими "_")
В большинстве случаев на маски вообще не рекомендую закладываться, поскольку можно очень хорошо «попасть». Один вариант Вы уже сами видели. Другой — при наличии в маске латиницы, а в перечне файлов — кириллицы. »
shadowbat, Вы, наверное, не поняли, в каком смысле здесь упомянута кириллица? Дело в том, что команды командной строки ("dir", "del", "copy", "move", "findstr", "find", "if", "for" и т. д., то есть те команды, которые синтаксически могут использовать подстановочные знаки) при работе с масками пользуются короткими именами, то есть стандартом "8.3", являющимся наследием "досовских" времён. Создание коротких имён по умолчанию включено на всех дисках во всех ОС, кроме Windows 8 и 8.1, в которых оно включено только для системного диска и подключаемых внешних жёстких дисков. Кириллические символы не могут присутсвовать в коротких именах, поэтому они заменяются на латинские. При совпадении какой-либо маски на латинице с частью коротких имён файлов или папок, имеющих "в миру" кириллические имена, происходит их обработка командой как подходящих под маску.
Но от этого могут "пострадать" не только файлы и папки с кириллическими именами, но и любые файлы и папки, чьё имя длиннее 8-ми, а расширение длиннее 3-х символов. Выполните команду dir /b "%TEMP%\*~*",
и Вы увидите чуть ли не всё содержимое папки "Temp", поскольку тильда присутсвует во всех коротких именах, не совпадающих с обычным именем.
Особым "цинизмом" отличается команда del *.htm *.doc *.jpe,
которая удалит как файлы с объявленными расширениями, так и файлы с расширениями ".html", ".docx", ".jpeg" и т. п., так как их короткие имена будут оканчиватся также объявленными в маске расширениями.
Дело в том, что команды командной строки ("dir", "del", "copy", "move", "findstr", "find", "if", "for" и т. д., то есть те команды, которые синтаксически могут использовать подстановочные знаки) при работе с масками пользуются короткими именами, то есть стандартом "8.3", являющимся наследием "досовских" времён. »
Не совсем так. Всё дело в WinAPI. FindFirstFile/FindNextFile обрабатывают и длинные, и короткие имена. Приложения лишь пользуются результатами вызовов.
Но от этого могут "пострадать" не только файлы и папки с кириллическими именами, но и любые файлы и папки, чьё имя длиннее 8-ми, а расширение длиннее 3-х символов. »
Угу. Просто с кириллицей нагляднее ;).
Особым "цинизмом" отличается команда … которая удалит как файлы с объявленными расширениями, так и файлы с расширениями ".html", ".docx", ".jpeg" и т. п., так как их короткие имена будут оканчиватся также объявленными в маске расширениями. »
Сюда же относится и интересный вопрос «Почему в мою маску «*.???» попадают файлы с более длинным расширением, которые я хотел отделить?» ;).
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.