Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Поиск по отрицательной маске *.* / not= dll (http://forum.oszone.net/showthread.php?t=145215)

semiono 15-07-2009 15:50 1168435

Поиск по отрицательной маске *.* / not= dll
 
Как? :)
Условия - рекурсивно, в текущем каталоге или же в указанном, если возможен батник с передачей условия в него...
а найти надо все файлы кроме заданного типа - любого.
хорошо бы батник такой чтоб не редактировать каждый раз, а передавать в него условия поиска? типа батник как утилита.

# ifind.cmd --not pdf (например)

Petya V4sechkin 15-07-2009 16:36 1168484

semiono, как-то так?
Код:

@Echo Off
SetLocal EnableExtensions

Set LstTmp="%Temp%\ifind_lst.tmp"
Dir /A-D /B "%~2%~1" >%LstTmp%
Dir /A-D /B "%~2" | FindStr /L /X /V /G:%LstTmp%

Батник принимает два параметра: 1-й - маска, второй - папка (со слешом в конце). Второй параметр необязателен (без него использует текущую папку).

Примеры:
Код:

ifind.cmd *.pdf E:\10\
ifind.cmd *.pdf

Если нужно искать в подкаталогах, добавить опцию /S в командах Dir.

NiOl 15-07-2009 19:53 1168673

Сабж показался интересным и решил "убить" время...

значить логика работы:
iFind.bat [MODE] [MASK MASK...] [MODE] [MASK MASK...]

Пакетник распознает следующие команды: + и - (по умолчанию включен режим +), вдобавок в момент запуска удаления списка файлов iFind.lst не происходит, т.е. при следующих запусках работа над списком продолжается.

Все остальное считается маской для поиска. В зависимости от текущего режима результат поиска либо добавляется либо удаляется из файла списка iFind.lst (в тек. каталоге). При добавлении файлов в список могус случаться повторы, например файл file03.mov годится и для маски *0?.* и для *.mov. Такие повторы убираются автоматом (лишние полтора полчаса на отладку ;) )

пример:
iFind *.jpg *.gif *.png - _*.* + _*.png
В список сначала отправляются все картинки (по умолчанию режим добавления), потом режим переключается на удаление и от туда удаляются все файлы, начинающиеся с подчеркивания, но потом режим снова переключается на добавление и обратно возвращаются png-картинки, начинающиеся с подчеркивания.

Код:

@echo off
set ListMode=Add
SetLocal EnableExtensions
SetLocal EnableDelayedExpansion

:Loop
if "%1"=="" Exit
set cmd=%1
shift
echo proc: %ListMode%: %cmd%
if "%cmd%"=="+" (set ListMode=Add) else if "%cmd%"=="-" (set ListMode=Sub) else Goto List_%ListMode%
echo      Set ListMode to "%ListMode%"
Goto Loop

:List_Add
if exist iFind.tmp del /f iFind.tmp
dir /s /b /on /a-d %cmd%>>iFind.lst
sort iFind.lst /O iFind.tmp
del /f iFind.lst
set prev=
for /F "delims=" %%L in (iFind.tmp) do if not "%%L"=="!prev!" (
EndLocal
echo %%L>>iFind.lst
SetLocal EnableExtensions
SetLocal EnableDelayedExpansion
set prev=%%L
)
del /f iFind.tmp
Goto Loop

:List_Sub
if exist iFind.tmp del /f iFind.tmp
dir /s /b /on /a-d %cmd%>iFind.tmp
for /F "delims=" %%L in (iFind.tmp) do (
for /F "skip=2 delims=" %%T in ('Find /V "%%L" iFind.lst') do echo %%T>>iFind.tmp2
del /f iFind.lst
ren iFind.tmp2 iFind.lst
)
del /f iFind.tmp
Goto Loop


amel27 16-07-2009 08:41 1169038

Цитата:

Цитата Petya V4sechkin
Батник принимает два параметра: 1-й - маска, второй - папка »

аналогичная функциональность одной строчкой: :)
Код:

DIR /B/A:-D "%~2"|FindStr /IVE "%~1"
пример использования:
Код:

xDIR.cmd ".exe .dll .ocx" %windir%\system32

Petya V4sechkin 16-07-2009 08:46 1169039

Цитата:

Цитата amel27
аналогичная функциональность одной строчкой:

Ну, я хотел сделать именно с произвольной маской, а не только расширением ;)
Хотя автору может быть достаточно и твоего варианта.

semiono 16-07-2009 17:30 1169616

Цитата:

Цитата NiOl
Сабж показался интересным и решил "убить" время... »

+1 :) так и бывает. Рождаются полезные весчи!

NiOl, получается функция кэшируется в список :)
а в памяти нельзя?

у меня какие-то глюки были, и консоль упала как буд-то бы от переполнения...

semiono 16-07-2009 17:48 1169637

amel27, можешь добавить хелп к твоему скрипту? :)
например if xDir --help или --h тогда то-сё... == {xDIR.cmd ".exe .dll .ocx" %windir%\system32}
и будет уже готовый инструмент! останеться только лицензию придумать ))) GPL

amel27 17-07-2009 05:36 1170114

Цитата:

Цитата semiono
можешь добавить хелп к твоему скрипту »

Код:

If %~1==--help Echo то-сё
З.Ы. не такой навороченый скрипт, чтобы снабжать хелпом...
ИМХО лучше текстовик приложить (xDir.hlp), чем громоздить лишний код

NiOl 21-07-2009 15:20 1173659

Цитата:

Цитата semiono
NiOl, получается функция кэшируется в список
а в памяти нельзя?
у меня какие-то глюки были, и консоль упала как буд-то бы от переполнения... »

Честно говоря я даже не представляю, как это сделать - весь список в переменную не засунуть - у меня при проверке создавались файлы больше 100к, а стандартный размер переменной 4к, кажется можно расширить до 64к, но контролировать, какого рамера сейчас переменная - очень медленный процесс. Я пару раз попытался засесть со "свежими" идеями, типа хранения списка файлов и структуры каталога чуть ли не в виде 2х раздельных БД, разбиение переменной на нумерованную серию, но... не потянул.


Время: 08:56.

Время: 08:56.
© OSzone.net 2001-