PDA

Показать полную графическую версию : [решено] Копирование и удаление файлов по маске


ul9
17-10-2012, 16:38
Здравствуйте.
Помогите пожалуйста решить проблему.
Есть папка с подпапками (около 30 штук). В каждой подпапке находятся текстовые файлы (всегда 900 txt).
Файлы имеют такой вид
result0000000.txt
result0000001.txt
result0000002.txt
...
и так до
result0000898.txt
result0000899.txt

Нужно удалить конкретные файлы. Я нашла вот такой скриптsetlocal enableextensions
set "MYPATH=E:\TEMPO_UPD\32-bit\En\UnPack\KBxxxxxx\"
set SOURSE=*.exe
for /f "tokens=*" %%i in ('dir /b/s/a-d "%MYPATH%%SOURSE%" ^| findstr /G:KB.log') do del /q /f "%%i"
endlocal
EXIT

Удалять нужно с result0000299.txt по result0000899.txt.
Конечно можно прописать список из 600 файлов, но неужели нет более элегантного решения?

А в другой подпапке нужно перенести из одной папки в другую файлы с result0000599.txt по result0000899.txt.
Тут я уже не смогла найти нужный скрипт...

Хоть я и выбрала категорию cmd/bat, способ решения мне не важен :)

С уважением,
Юлия

Iska
17-10-2012, 18:13
Удалять нужно с result0000299.txt по result0000899.txt. »
Выполните непосредственно в командной строке (не в пакетном файле):
for /l %i in (299,1,899) do @del /s /q "E:\Песочница\0184\result0000%i.txt" 2>nul
где вместо E:\Песочница\0184 укажите путь к Вашей папке («Есть папка с …»).

А в другой подпапке нужно перенести из одной папки в другую файлы с result0000599.txt по result0000899.txt. »
Это какая другая подпапка?

ul9
17-10-2012, 18:37
Я через AutoScriptWriter записала себе порядок действий по генерации файлов.
Приведу пример.
Есть основная папка work, а в ней подпапки test1, test2, test3, test4 и т.д.. В каждой из этих подпапок по 900 txt файлов.
В папке test1 нужно оставить первые 300 файлов (result0000000.txt - result0000299.txt), все остальные удалить.
Из папки test2 перенести (result0000300.txt - result0000599.txt) в папку test3, а (result0000599.txt - result0000899.txt) в test4.
Надеюсь не косноязычно получилось :)


Выполните непосредственно в командной строке (не в пакетном файле):
for /l %i in (299,1,899) do @del /s /q "E:\Песочница\0184\result0000%i.txt" 2>nul

Плохо, что нельзя добавить в свой скрипт, т.к. процедура довольно регулярная.

Iska
17-10-2012, 20:02
а в ней подпапки test1, test2, test3, test4 и т.д. … »
1. И сколько будет «и т.д.»?
2. Как поступать с файлами из test5, test6 … testNN?
3. Сами папки вида testXX не имеют вложенных? То есть, не надо искать файлы result0000XX.txt ещё и во вложенных в test1, test2 …?

Из папки test2 перенести (result0000300.txt - result0000599.txt) в папку test3 »
1. Папки test3 и test4 уже существуют или их надо создавать?
2. Если — «Существуют», то что делать, если в test3 и/или в test4 окажутся одноимённые файлы?

Плохо, что нельзя добавить в свой скрипт, т.к. процедура довольно регулярная. »
Можно. Только не именно этот код. Этот — удалит Вам все подходящие файлы из всех testXX, вложенных в указанную, а не только из test1.

ul9
17-10-2012, 20:19
Как я себе представляю логику скрипта. Вначале я распределяю файлы по папкам, после переименовываю их в result0000000.txt - result0000299.txt, а все остальные удаляю из всех папок.
1. И сколько будет «и т.д.»? »
Порядка 30 папок
2. Как поступать с файлами из test5, test6 … testNN? »
Я готова прописать действия вручную для каждой папки.
3. Сами папки вида testXX не имеют вложенных? То есть, не надо искать файлы result0000XX.txt ещё и во вложенных в test1, test2 …? »
Вложенных папок нет, но названия у них не test, это я для примера написала. Папки имеют названия в транслите с нижним подчёркиванием без прочих знаков пунктуации, вот пример (rezim_raboti).
1. Папки test3 и test4 уже существуют или их надо создавать? »
Все необходимые папки существуют.
2. Если — «Существуют», то что делать, если в test3 и/или в test4 окажутся одноимённые файлы? »
test3 и test4 изначально пустые, они создаются специально
MD D:\work\notarius_pomosh

ul9
18-10-2012, 19:20
...что-то тема затихла...
А как можно запустить этот код из батника?
for /l %i in (299,1,899) do @del /s /q "E:\Песочница\0184\result0000%i.txt" 2>nul

Iska
18-10-2012, 19:35
...что-то тема затихла... »
Не затихла. Но для меня, например, какие-то моменты требуют осмысления. Даже для того, чтобы задать очередные уточняющие вопросы.

А как можно запустить этот код из батника? »
Удвоив «%» при переменных цикла разбора и выкинув ненужные подавления вывода:
@echo off
setlocal enableextensions enabledelayedexpansion

for /l %%i in (299,1,899) do del /s /q "E:\Песочница\0184\result0000%%i.txt" 2>nul

endlocal
exit /b 0

Но запускать его пока не рекомендую: удалите указанные файлы во всех вложенных папках.

ul9
18-10-2012, 19:52
Не затихла. Но для меня, например, какие-то моменты требуют осмысления. Даже для того, чтобы задать очередные уточняющие вопросы. »
У меня, к сожалению, ограничено время... Задавайте все вопросы, не стесняйтесь :)
Но запускать его пока не рекомендую: удалите указанные файлы во всех вложенных папках. »
К сожалению альтернативы нет. Придётся сначала перемещать файлы этим скриптом, нашла его на этом форуме.

@Echo Off
cls
FOR /F "usebackq delims=" %%f IN ("D:\Delete\filelist.txt") DO Call :MoveFile "%%~f"
GoTo :Eof

:MoveFile

Set Out="%~dp1"
Set Out=%Out:"c:\src\="d:\dsc\%
Set Out=%Out:\"="%

Md %Out% >nul 1>nul 2>nul

Move %1 %Out%

Буду для каждой папки задавать что куда.
Потом так переименую для каждой папки
@echo off

setlocal enableextensions enabledelayedexpansion
set /a lCount = 0
for /f "delims=*" %%i in ('dir /b /s "D:\work\nasledstvo\*.txt"') do (
set /a lCount += 1
ren "%%i" "file!lCount!%%~xi"
)
endlocal

exit /b 0

А потом буду прогонять вашим кодом
@echo off
setlocal enableextensions enabledelayedexpansion
for /l %%i in (299,1,899) do del /s /q "E:\Песочница\0184\result0000%%i.txt" 2>nul
endlocal
exit /b 0

vserd
18-10-2012, 23:15
D:\work\nasledstvo\*.txt
ren "%%i" "file!lCount!%%~xi"
выполнять не рекомендую, замучаетесь потом маску выставлять.
file1.txt
file10.txt
file100.txt

Сделайте себе несколько батников
1. Удаление 600 файлов.
2. Перенос из папки в папку 300 файлов. (замените в скрипте из второго поста @del на move и соответствующие цифры.

удаление 600 файлов из папки test1
del600.cmd d:\test1

удаление 600 файлов из папки test22
del600.cmd d:\test22
тело
for /l %%i in (299,1,899) do del /q "%1%%i.txt" 2>nul

%1, %2 .... %9 означают параметры переданные команднику.

перемещение из d:\test1 в d:\test2

move599.cmd d:\test1 d:\test2

for /l %%i in (299,1,599) do move "%1%%i.txt" "%2"

со вторым списком аналогично.

крайне рекомендую все папки по которым будет проводиться очистка заархивировать и спрятать на другой диск.
при проверке батников можно перед командами del, Move поставить echo. Будет длинный список команд .

Настоятельно рекомендую прочитать справку по командам for, if, set
Обязательно читать справку по del, Move и любым командам которые удаляют/копируют/перемещают папки или файлы.
cmd /k help for
help if
help set
help

В путях пускай не будет пробелов, %, !, ~ и других спец символов, аккуратней с русскими буквами

Iska
19-10-2012, 05:54
Задавайте все вопросы, не стесняйтесь »
ul9, после Ваших последних постов я совершенно перестал понимать Ваши потребности.

Максимум того, что могу предложить — это дать примерное представление.

1.
Есть основная папка work, а в ней подпапки test1, test2, test3, test4 и т.д.. В каждой из этих подпапок по 900 txt файлов.
В папке test1 нужно оставить первые 300 файлов (result0000000.txt - result0000299.txt), все остальные удалить. »
for /l %%i in (299,1,899) do del /q "c:\Work\test1\result0000%%i.txt" 2>nul

2.
Из папки test2 перенести (result0000300.txt - result0000599.txt) в папку test3 »
При условии, что «test2» и «test3» находятся на одном разделе, и «test3» существует:
for /l %%i in (300,1,599) do move /y "c:\Work\test2\result0000%%i.txt" "c:\Work\test3\" 2>nul

3.
а (result0000599.txt - result0000899.txt) в test4. »
При условии, что «test2» и «test4» находятся на одном разделе, и «test4» существует:
for /l %%i in (599,1,899) do move /y "c:\Work\test2\result0000%%i.txt" "c:\Work\test4\" 2>nul
Если данный код будет исполняться после 2) — файла «result0000599.txt» в исходной папке уже не будет: он будет перемещён кодом 2) в «test3».

dee.jack
25-03-2013, 10:09
Прошу прощения, если пишу не туда, помогите с такой проблемой, вроде простая проблема, но не могу сообразить как ее решить:
При запуске батника необходимо сделать резервную копию файла:
md "%CD%\rezerv"
copy "%CD%\test.exe" "%CD%\rezerv"
Дальше как продолжить, чтоб копия не перемещалась в папку rezerv, если там уже есть test.exe?
Да, и желательно бы чтоб сообщение в строке появилось, что файл уже существует.
Спасибо заранее.




© OSzone.net 2001-2012