![]() |
Как из папки выбрать в переменную уникальные имена файлов
День добрый,
подскажите, запутался, есть каталог, в нем файлы типа: 2010.07.21-xx_ab.zip 2010.06.14-xxx.zip 2010.08.21-xx_ab.zip 2010.09.14-xxx.zip 2010.07.11-xx_ab.zip 2010.06.04-xxx.zip 2010.08.26-xx_ab.zip 2010.02.14-xxx.zip Мне нужна переменная в которой только уникальные имена, т.е. например x=xx_ab xxx Затык в том, что у меня получается цикл в цикле: 1. бежать в каталоге по именам файлов 2. если в нашей переменной такое имя не встречалось, то set переменная=%переменная% %имя_текущего_файла% в этом случае второй цикл не хочет просматривать переменную и тем более "на ходу" ее дополнять Код:
@echo off Код:
@echo off |
Уточните проблему более подробными примерами - ничего не понятно.
|
Уточняю:
каждый день на сервере появляются файлы бэкапа в виде zip-архивов. Эти файлы ВСЕ в имени сначала имеют дату создания, затем уникальное имя - то с чего сделан бэкап. Этого "то с чего сделан бэкап" у меня около 12 штук. Вопрос: в каталоге может быть несколько тысяч файлов, но мне нужно знать именно их уникальные имена, то есть с чего это бэкапы. Пример: 2010.07.21-xx_ab.zip, где 2010.07.21 - дата xx_ab - уникальное имя Более того, я уже даже решил проблему, но по извращенному: Код:
for /f "tokens=1* delims=-" %%i in ('dir *.zip /b') do (echo. > %%j.id) В конечном итоге по этим файликам я точно знаю какие именно бэкапы в каталоге и могу уже использовать их имена для задания маски для дальнейшей обработки. (мне нужно каждого типа бэкапов хранить всего 5 последних штук, т.е. с сервера-1 5 последних, сервера-2 5 последних и т.д) Хочу услышать критику и возможно решение через find. Может кто-то покажет красивее? Не 1й раз пишу на этом форуме, и хочу предупредить, я хочу решение ИМЕННО в виде bat, на худой конец vbs. Не предлагайте варианты стороннего ПО, все должно работать "из коробки". P.S. Почему не обрабатывается переменная цикла в цикле?? Не помню таких ограничений. т.е. например for %%i do (for %%x do ...) - как обойти ограничение что %х игнорируется?? Не понимаю я SetLocal EnableExtensions SetLocal EnableDelayedExpansion или вернее для передачи переменной в цикл надо ее брать в !переменная! а как взять в "!" переменную %%i? Понимаю вопрос задал криво, но вот как есть |
могу предложить первым циклом забросить имена в файл:
Код:
for /f "tokens=1* delims=-" %%i in ('dir *.zip /b') do ( Код:
for /f "delims= " %%x in ('sort 1.tmp') do ( ps: лучше взять временное имя файла и в конце удалить его. |
Цитата:
Код:
@Echo Off |
QRS
В цикле сортировки, если верить подсказке на команду if то операторы сравнения (neq - не равно) допустимо использывать при "расширенной обработке команд"... Точно ли не нужен ключ "/i"??? И не совсем понял сколько раз нужно делать цикл? Ведь будут исключены лишь явно повторяющиеся значения последовательности, например 1123112 превратится в 12312. Мне то на выхлопе нужно получить просто 123... Может я что-то не правильно понял про команду sort? (фокус с созданием файлов в том что при выполнении цикла они др др заменяют, но в итоге остаются лишь "уникальные") El Sanchez Круто, только можно прокомментировать строки? Если честно не все понимаю... хотя и вижу сценарии не 1й раз... |
Banzaika,
Цитата:
Цитата:
Сама процедура: Цитата:
наше количество строк Count, переданное из основного цикла. Skip не может начинаться с нуля, по-этому в самом начале и записана пустая строка в _UniqueNames.log. В %С попадет последняя строка, содержащая уникальное имя. For /F "Skip=%NumSavedFiles% Tokens=*" %%D In ('Dir /B /O-D /TC "%Source%\*%%C"') Do Del /F /Q "%Source%\%%D" 1>nul 2>&1 - сортируем все файлы, содержащие в себе уникальное имя %C, начиная с самого нового (/O-D /TC), пропускаем нужные 5 файлов (%NumSavedFiles%), а все остальное удаляем. Set /A Count+=1 - увеличиваем количество строк, т.к. при следующем найденном уникальном имени нужно будет пропускать в _UniqueNames.log на строку больше. |
Banzaika,
Вариант №2, попроще и покороче, но время выполнения дольше: Код:
@Echo Off |
Время: 21:33. |
Время: 21:33.
© OSzone.net 2001-