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

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

Lil Crazy 12-05-2010 15:07 1411687

Перенос из заданных директорий в новую файлы, содержащие заданное слово
 
Как написать .bat/.cmd файл для переноса из заданных директорий в новую файлы, содержащие заданное слово?
Кое-как начал разбираться - получилось что-то следующее (до это не имел со скриптами дел):
Код:

setlocal enableextensions
setlocal enabledelayedexpansion
for /f %%a in ('dir "путь\*паттернкакойнить*" /A:-D /B ') do (
 move \Y "путь\"%%a "путь2\"%%a )

В инете нашёл скрипт как он бы выглядел в юниксах:
Код:

cd /zadanniy/katalog
for i in `grep -R SLOVO *`
do
 mv "$i" /noviy/katalog
done


leonaft 12-05-2010 17:43 1411779

Из справки Windows:
Цитата:

Чтобы переместить все файлы с расширением XLS из каталога \Data в каталог \Second_Q\Reports, введите:

move \data\*.xls \second_q\reports\
т.е. маску можно задавать в самой команде перемещения,
Код:

move "путь1\*слово*" "путь2\"

megaloman 12-05-2010 18:35 1411808

Цитата:

Цитата Lil Crazy
для переноса из заданных директорий в новую файлы, содержащие заданное слово »

- слово в названии файла , или слово в тексте текстового файла (кстати, а кодировка его какая?) Если в названии, то
move "путь1\*слово*.*" "путь2\"

Lil Crazy 12-05-2010 19:25 1411832

Цитата:

Цитата megaloman
для переноса из заданных директорий в новую файлы, содержащие заданное слово
- слово в названии файла , или слово в тексте текстового файла (кстати, а кодировка его какая?) Если в названии, то move "путь1\*слово*.*" "путь2\" »

слово в тексте файле, кодировка любая

amel27 13-05-2010 05:04 1412063

Код:

@Echo Off

Set TEXT=SLOVO
Set DIR1=C:\TEST1
Set DIR2=C:\TEST2

For /F "Delims=" %%i In ('FindStr /SMC:"%TEXT%" "%DIR1%\*"') Do Move "%%i" "%DIR2%"


Lil Crazy 13-05-2010 14:39 1412379

Цитата:

Цитата amel27
Код:

@Echo Off
Set TEXT=SLOVO
Set DIR1=C:\TEST1
Set DIR2=C:\TEST2
For /F "Delims=" %%i In ('FindStr /SMC:"%TEXT%" "%DIR1%\*"') Do Move "%%i" "%DIR2%" »


А для того чтобы в нескольких директориях искать файлы надо соответственно задать ещё несколько директорий и в добавить в код?
Код:

For /F "Delims=" %%i In ('FindStr /SMC:"%TEXT%" "%DIR1%\*" "%ещё n-количество директорий%\*"') Do Move "%%i" "%DIR2%"
Но так у меня ничего не вышло - ищет и перемещает только в первой директории:
Код:

@Echo Off

Set TEXT=SLOVO
Set DIR1=C:\TEST1
Set DIR2=C:\TEST2
Set DIR3=C:\TEST3

For /F "Delims=" %%i In ('FindStr /SMC:"%TEXT%" "%DIR1%\*" "%DIR2%\*"') Do Move "%%i" "%DIR3%"

@pause

И как сделать так чтобы можно было вводить самому кол-во директорий и сами пути директорий, и слово, что надо искать (или хотя бы считывать их с текстового файла)?
И я так понимаю, что сделать отображение перемещаемых файлов (именно названия файлов, то есть какие файлы перемещены) довольно проблематично?

amel27 13-05-2010 17:41 1412527

Цитата:

Цитата Lil Crazy
For /F "Delims=" %%i In ('FindStr /SMC:"%TEXT%" "%DIR1%\*" "%DIR2%\*"') Do Move "%%i" "%DIR3%" »

тогда уж так:
Код:

@Echo Off

Set TEXT=SLOVO
Set DIR1=C:\TEST1
Set DIR2=C:\TEST2
Set DIR3=C:\TEST3

For /F "Delims=" %%i In ('FindStr /SMC:"%TEXT%" "%DIR1%\*"^&FindStr /SMC:"%TEXT%" "%DIR2%\*"') Do Move "%%i" "%DIR3%"

@pause

Цитата:

Цитата Lil Crazy
как сделать так чтобы можно было вводить самому кол-во директорий и сами пути директорий, и слово »

Код:

@Echo Off

:TXT
Set /P $TXT="Что ищем: "
If "%$TXT%"=="" GoTo TXT

:NUM
Set /P $NUM="Количество папок: "
Set $IDX=1& Set /A $NUM+=0
If %$NUM% EQU 0 GoTo NUM

:DIR
Set /P $_%$IDX%="Путь к папке %$IDX%: "
Call Set $T=%%$_%$IDX%%%
If Exist %$T% Set /A $IDX+=1
If %$IDX% LEQ %$NUM% GoTo DIR

Set $MOVE=C:\TEST& Echo.
For /F "Tokens=1* Delims==" %%a In ('Set $_') Do For /F "Delims=" %%i In (
'FindStr /SMC:"%$TXT%" "%%b\*"') Do Move "%%i" "%$MOVE%"& Echo "%%i"


Lil Crazy 13-05-2010 20:00 1412628

Код:

@Echo Off

:TXT
Set /P $TXT="Input word for search: "
If "%$TXT%"=="" GoTo TXT

:NUM
Set /P $NUM="Number of dirs: "
Set $IDX=1& Set /A $NUM+=0
If %$NUM% EQU 0 GoTo NUM

:DIR
Set /P $_%$IDX%="Path to folder %$IDX% for search: "
Call Set $T=%%$_%$IDX%%%
If Exist %$T% Set /A $IDX+=1
If %$IDX% LEQ %$NUM% GoTo DIR

:MOVE
Set /P $MOVE="Input destinantion dir: "
If "%$MOVE%"=="" GoTo MOVE

For /F "Tokens=1* Delims==" %%a In ('Set $_') Do For /F "Delims=" %%i In (
'FindStr /SMC:"%$TXT%" "%%b\*"') Do Move "%%i" "%$MOVE%"& Echo "%%i"

@pause

этот скрипт получается работает только с английскими словами? с русскими ничего не находит

amel27 14-05-2010 06:09 1412895

Цитата:

Цитата Lil Crazy
получается работает только с английскими словами? с русскими ничего не находит »

текст вводится в OEM (DOS/866) кодировке... соответственно, и ищется в ней,
вариант через временный файл для поиска в 3-х кодировках (DOS/WIN/UTF8):
Код:

@Echo Off

:TXT
Set /P $TXT="Input word for search: "
If "%$TXT%"=="" GoTo TXT

Echo %$TXT%>"%~dpn0.tmp"
CHCP 1251 |>>"%~dpn0.tmp" Echo %$TXT%&CHCP 866 >Nul
CHCP 65001|>>"%~dpn0.tmp" Echo %$TXT%&CHCP 866 >Nul

:NUM
Set /P $NUM="Number of dirs: "
Set $IDX=1& Set /A $NUM+=0
If %$NUM% EQU 0 GoTo NUM

:DIR
Set /P $_%$IDX%="Path to folder %$IDX% for search: "
Call Set $T=%%$_%$IDX%%%
If Exist %$T% Set /A $IDX+=1
If %$IDX% LEQ %$NUM% GoTo DIR

:MOVE
Set /P $MOVE="Input destinantion dir: "
If "%$MOVE%"=="" GoTo MOVE

For /F "Tokens=1* Delims==" %%a In ('Set $_') Do For /F "Delims=" %%i In (
'FindStr /SMG:"%~dpn0.tmp" "%%b\*"') Do Move "%%i" "%$MOVE%" >Nul& Echo "%%i"


Lil Crazy 14-05-2010 13:44 1413186

amel27, спасибо вам огромное! Ещё один вопрос хотел задать только: как сделать чтобы бы в консоли выводились перемещаемые файлы и сохранить их в создаваемый автоматически текстовый файл как лог-файл, то есть:
Цитата:

C:\StartFolder\fle1.txt ------> C:\DestinationFolder\file1.txt
Код:

@Echo Off

:TXT
Set /P $TXT="Input word for search: "
If "%$TXT%"=="" GoTo TXT

Echo %$TXT%>"%~dpn0.tmp"
CHCP 1251 |>>"%~dpn0.tmp" Echo %$TXT%&CHCP 866 >Nul
CHCP 65001|>>"%~dpn0.tmp" Echo %$TXT%&CHCP 866 >Nul

:NUM
Set /P $NUM="Number of folders: "
Set $IDX=1& Set /A $NUM+=0
If %$NUM% EQU 0 GoTo NUM

:DIR
Set /P $_%$IDX%="Path to folder %$IDX% for search: "
Call Set $T=%%$_%$IDX%%%
If Exist %$T% Set /A $IDX+=1
If %$IDX% LEQ %$NUM% GoTo DIR

:MOVE
Set /P $MOVE="Input destinantion folder: "
If "%$MOVE%"=="" GoTo MOVE
If not Exist "%$MOVE%" MkDir "%$MOVE%"

For /F "Tokens=1* Delims==" %%a In ('Set $_') Do For /F "Delims=" %%i In (
'FindStr /SMG:"%~dpn0.tmp" "%%b\*"') Do Move "%%i" "%$MOVE%" >Nul& Echo "%%i"

Del "%~dpn0.tmp"

@pause

а то в этом скрипте выводятся просто файлы из начальной директории списком, без конечной папки

amel27 14-05-2010 16:19 1413298

Цитата:

Цитата Lil Crazy
C:\StartFolder\fle1.txt ------> C:\DestinationFolder\file1.txt »

Код:

Echo Off

:TXT
Set /P $TXT="Input word for search: "
If "%$TXT%"=="" GoTo TXT

>"%~dpn0.tmp" Echo %$TXT%
CHCP 1251 |>>"%~dpn0.tmp" Echo %$TXT%&CHCP 866 >Nul
CHCP 65001|>>"%~dpn0.tmp" Echo %$TXT%&CHCP 866 >Nul

:NUM
Set /P $NUM="Number of folders: "
Set $IDX=1& Set /A $NUM+=0
If %$NUM% EQU 0 GoTo NUM

:DIR
Set /P $_%$IDX%="Path to folder %$IDX% for search: "
Call Set $T=%%$_%$IDX%%%
If Exist %$T% Set /A $IDX+=1
If %$IDX% LEQ %$NUM% GoTo DIR

:MOVE
Set /P $MOVE="Input destinantion folder: "
If "%$MOVE%"=="" GoTo MOVE
If Not Exist "%$MOVE%" MkDir "%$MOVE%"

For /F "Tokens=1* Delims==" %%a In ('Set $_') Do For /F "Delims=" %%i In (
'FindStr /SMG:"%~dpn0.tmp" "%%b\*"') Do Move "%%i" "%$MOVE%" >Nul& Echo %%i ---^> %$MOVE%\%%~nxi

Del "%~dpn0.tmp"

@pause


Lil Crazy 14-05-2010 20:46 1413448

amel27, спасибо за помощь!


Время: 15:19.

Время: 15:19.
© OSzone.net 2001-