Войти

Показать полную графическую версию : [решено] Поиск по отрицательной маске *.* / not= dll


semiono
15-07-2009, 15:50
Как? :)
Условия - рекурсивно, в текущем каталоге или же в указанном, если возможен батник с передачей условия в него...
а найти надо все файлы кроме заданного типа - любого.
хорошо бы батник такой чтоб не редактировать каждый раз, а передавать в него условия поиска? типа батник как утилита.

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

Petya V4sechkin
15-07-2009, 16:36
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
Сабж показался интересным и решил "убить" время...

значить логика работы:
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
Батник принимает два параметра: 1-й - маска, второй - папка »
аналогичная функциональность одной строчкой: :)
DIR /B/A:-D "%~2"|FindStr /IVE "%~1"
пример использования:
xDIR.cmd ".exe .dll .ocx" %windir%\system32

Petya V4sechkin
16-07-2009, 08:46
аналогичная функциональность одной строчкой:
Ну, я хотел сделать именно с произвольной маской, а не только расширением ;)
Хотя автору может быть достаточно и твоего варианта.

semiono
16-07-2009, 17:30
Сабж показался интересным и решил "убить" время... »
+1 :) так и бывает. Рождаются полезные весчи!

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

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

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

amel27
17-07-2009, 05:36
можешь добавить хелп к твоему скрипту »
If %~1==--help Echo то-сё

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

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

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




© OSzone.net 2001-2012