Автозамена при перемещении
У меня есть много одинаковых (по имени - Material3) папок в различных под папках, очень много, в эти папках находятся *.mat файлы, среди *.mat файлов попадаются одинаковые
скриптом: Код:
for /f "tokens=*" %%b in ('dir /b /s Material3') do move /y "%%b" "%%~dpb../.." |
- ключ /Y работает только для файлов, а не для папок;
- в каталоге батника не должно быть папки "Material3", иначе DIR просто выдаст её содержимое; вариант через XCOPY и RD: Код:
if not exist Material3 for /f "delims=" %%a in ('dir /b/s/ad Material3') do ( |
дело в том, что общий объём файлов может составлять до 50 гб, поэтому и хотел использовать именно move, так как нет возможности копировать такое количество мегабайт
add: ваш вариант работает add2: а как работает скрипт? Код:
находит папку -> копирует в нужное место -> удаляет оригинал либо Код:
находит папку -> копирует в нужное место -> находит папку -> копирует в нужное место -> ...находит и копирует все папки... -> удаляет оригиналы если первый вариант, то это вполне нормально (на диске единовременно не будет очень много скопированной информации) |
Цитата:
Цитата:
Код:
@echo off - операция одноразовая, скрипт поднимает на два уровня каждую папку Material3, 2-й запуск поднимет также и целевую папку, т.к. у них одинаковые имена |
Большое спасибо, всё работает!
|
появилась проблема, иногда файлы в папках Material3 имеют одинаковое имя, но разный размер (т.е по сути это другие файлы), как сделать так чтобы перед заменой файлов проводилась проверка размера, и если файл *.mat в папке имеет то же имя, но другой размер то к имени нового файла добалялось бы "01,02,03...и.т.д"
|
Tosyk, как-то так:
Код:
@echo off |
проверил, работает, проверяет, изменяет имя, по крайней мере первого уровня (_01.mat)
а как добавить ещё одну (или несколько) папку в обработку помимо Material3, пытаюсь сделать: Код:
@echo off |
попробуйте программу robocopy . это типа xcopy и просто copy , так же она от Microsoft и имеет КУЧУ пользных и гибких ключей , для копирование и т.п.
|
Цитата:
|
Цитата:
Код:
@echo off |
amel27, не понимаю зависимости, как добавить ещё несколько папок, не разберу из последнего скрипта.
нужно просто добавлять к Код:
Call :MainExe Material3 Код:
Call :MainExe Folder01 |
Tosyk, да
кстати, зря проигнорировали предложение forsem, в отличие от XCOPY, у ROBOCOPY есть ключ по перемещению папок |
Работает чётко! Спасибо
а как сделать чтобы после перемещения удалялась исходная папка? Допустим такая структура: Код:
_export_ Код:
RD /S/Q _export_ p.s.: я не проигнорировал упоминание ROBOCOPY, просто во-первых я "тупо не шарю", извените за сленг, а во-вторых я считаю, что если взялся за что-то одно, его нужно завершить. |
такая непонятность:
скрипт завис (не крашился а завис) на 814 файле и не идёт дальше. касперский негодует в диспетчере задач постоянно выскакивает и пропадает процесс fc.exe папки с файлами Material3 ещё есть |
Цитата:
Код:
@echo off |
Спасибо, а как быть с остановившимся процессом, касперский отключил, но ничего не изменилось?
p.s.: последний файл был M01_00.mat |
Цитата:
Код:
script.bat >script.log 2>&1 P.S. антивирус может блокировать файлы и тем самым препятствовать их удалению/переименованию |
Отключил антивирус, запустил скрипт снова, перемещено 3 500 файлов (вкупе 4 папки), полёт нормальный, в первый раз ошибок не заметил, постоянно наблюдал, на экране написано 1 file(s) moved - много раз.
p.s.: осталась самая полновесная папка - 56 000 элементов. |
а с чем может быть связана невероятно низкая скорость работы скрипта? без касперского
примерно 2-3 файла в 5-9 минут виндовс на компе несколько дней, никаких лишних программ не стоит даже офиса нет |
Цитата:
- ограничиться для сравнения размером, но могут встретиться два разных файла одного размера; - использовать более быстрые альтернативы, чем FC.EXE... например, порт Unix-утилиты DIFF.EXE |
а если использовать diff.exe, то кинуть его в папку к скрипту, а скрипт будет выглядеть так?:
Код:
@echo off |
конечно нет, у DIFF совсем другие ключи, заменяемая строка будет выглядеть так:
Код:
diff -q --binary "%~1" "%~2%~n1%$s%%~x1">nul&& (del/f/q "%~1"&& GoTo:EOF||exit/b 3) |
а скажите, как тогда изменится весь скрипт?
так?: Код:
@echo off |
Tosyk, не хочу замусоривать ветку копиями одного и того же кода (и вам не советую)
подсветил заменяемую строку в посте #16 |
прошу меня простить, если нужно я почищу ветку
начинаю тестировать, натравил скрипт |
к сожалению скорости особо не прибавилось, после 600-700 элементов начинаются серьёзные задержки - 40-90 сек для каждого файла, и это только файлы размером в 1 кб, однако впереди файлы размером от 1 до 24 мегабайт (56000 элементов),
на самом деле я за надёжность!, но скажите как будет выглядеть скрипт не сравнивающий файлы по-байтно. p.s.: и скрипт опять остановился на 814-ом файле :) |
Цитата:
Цитата:
|
если скрипт применяется к каждому файлу отдельно, то скорее всего дело в задержке его какими-то условиями
Цитата:
Цитата:
Цитата:
Цитата:
файлов действительно очень много |
amel27, приветствую, поможете мне?
|
Tosyk, увы, мне отсюда не видно,
пост #18 - как получить лог для проблемного запуска (и не забыть убрать @echo off) |
Хорошо, сейчас сделаю распаковку, а затем с логом запущу скрипт.
Я всего лишь хотел попросить помочь со скриптом проверяющим только размер. возможно получилось бы, потому что распаковка занимает часа 4, плюс скрипт "по теме" до проблемного места (814 файл) работает около 2 часов |
Tosyk, простая замена одной проверки другой ничего не даст - даже чуть замедлит работу, тут нужно пересматривать весь алгоритм... попробую глянуть, но ничего не гарантирую, да и причину сбоя всё равно надо знать...
|
скрипт остановился на 814 файле, на том же самом (M01_00.mat), оказывается он всегда на этом файле останавливается, прошлый раз я был не прав когда сказал, что всегда последний файл другой.
так вот, в "подопытной структуре" остались ещё папки Material3 с примерно сотней файлов *.mat. насмотря на остановку скрипта, в лог он продолжал записывать, да так много, что script.log вырос до 45 мегабайт, я остановил скрипт. Касперский сходит с ума сейчас. нужен этот лог? я посмотрел в него и вот, что выяснил: - оригинальный файл называется M01.mat - обработка M01.mat начинается с середины script.log и ему присваивается индекс _00 - далее всем файлам M01.mat отличающимся по содержанию присваивается индекс от _00 до _99 - нашёл папку, на которой останавливается работа скрипта и дальше во всех папках присутствуют необработанные *.mat, наряду с большим количеством (относительно других) M01.mat вывод, личный, так как не специалист: скрипт обрабатывает 100 разных файлов M01.mat, затем повторяет операцию над последним файлом снова и снова, что и было замечано в script.log: обработчик поочерёдно пытается одному и тому же файлу присвоить индекс от _00 до _99, после неудачи операция повторяется. |
Цитата:
|
а как тогда быть со скриптом? что нужно исправить в нём для добавления индекса с большим числом знаков?
|
а сколько знаков хватит?.. три?.. четыре?
|
на много время обработки вырастет если добавить:
Цитата:
в любом случае нужно не менее 4 символов! а по-поводу скрипта проверяющего размер, действительно он ничем не быстрее? хочется всё таки максимально ускорить процесс. |
Цитата:
|
Цитата:
У МЕНЯ ЕСТЬ СТРУКТУРА: <root>\extractor.exe <root>\archives_container\сколь угодно глубокая и сложная структура, содержит архивы <root>\script.bat каждый архив содержит одинаковую структуру папок, но разные (в основном) имена файлов: ----- Назову условно структуру - STRUCT01 ----- [strucrt01] Material3\содержит *.mat файлы MatInst\содержит *.mat файлы ... FolderLast\содержит *.tga файлы [/strucrt01] РАБОТА СКРИПТА: 1 - распаковка архивов происходит в структуру: <root>\_extracted\название_1-ого-архива\STRUCT01\файлы <root>\_extracted\название_2-ого-архива\STRUCT01\файлы ...и т.д. 2 - теперь начинает работать скрипт по поиску и переносу файлов: например он нашёл файл M01.mat в <root>\_extracted\название_1-ого-архива\Material3\ и переносит его в папку (используя как раз 2 уровня вверх): <root>\Material3\ получается у меня в корне будут все нужные мне папки (около 5-6) с файлами, вместо очень большого количества файлов в папке: <root>\_extracted\ которая после завершения операции должна быть 0 байт p.s.: надеюсь не слишком тупо написал, хотел как понятнее |
Tosyk, если переносятся ВСЕ подпапки со 2-го уровня, тогда какая разница как они называются - Material3 или еще как?.. или их надо фильтровать по имени на стадии переноса?..
Цитата:
|
Цитата:
Цитата:
|
Цитата:
Код:
@echo off |
ой, а как добавить папки в обработку? или как он работает?
|
|
говорит
Код:
Непредвиденное появление: \%~na!?%~zb?!$b!. |
Цитата:
|
лог такой:
Код:
Сканирование и подготовка каталогов...OK |
|
я серьёзно, именно это
Цитата:
|
Tosyk, обновите батник, уберите "@echo off" и повторите вывод в лог
|
теперь пишет это:
Код:
F:\il tempo>SETLOCAL EnableDelayedExpansion и появился файл в корне script_only_mover_2.$~1 |
Цитата:
|
ааа, скрипт обновлён в прошлом сообщении, сразу не понял, что значит обновить скрипт
вот содержание лога: Код:
F:\il tempo>set root=.\_export_ |
Цитата:
Цитата:
одну ошибку исправил - проверяйте |
запустил команду script_only_mover_2.bat >script.log 2>&1, убрав "@echo off"
ничего не видно в окне cmd, но размер script.log меняется, плюс создался и меняется такой файл script_only_mover_2.$~1 в общем процесс я так понимаю идёт |
Цитата:
а вывода на экран и не должно быть - всё пишется в лог-файл |
кажется скрипт завершил работу, он как бы не отвечает, просто стоит, лог не пишется дальше, только 3 мегабайта.
скрипт создал в корне структуру [struct01] из этого поста #40 и всё, пустые папки, файлы на месте (в .\_export_\) нужен этот лог? плюс ещё в корне лежит файл script_only_mover_2.$~1 (536кб) |
Цитата:
|
|
Tosyk, ничего особенного - из лога видно, что процесс был прерван вручную комбинацией Ctrl+C, попробуйте сначала прогнать скрипт без лога, либо уменьшите количество папок - с логом скрипт работает в десятки раз медленней
|
Запустил опять остановился, странно опять остановился на том же самом каталоге на котором останавливался и самый первый скрипт из темы, имя каталога "wp_Zephi_st2_3_Rose". это первый каталог в котором в Material3 присутствует уже упомянутый M01.mat. Сподкнулся он именно на этом файле, т.к в script_only_mover_2.$~1 существует последовательность:
Код:
... Код:
..\_export_\wp_Zephi_st2_3_Rose\Material3 |
Цитата:
Код:
@echo off |
запустил скрипт (script_only_structer_4_eng.bat), появилось чёрное окно cmd, во время выполнения появился и рос файл script_only_structer_4_eng.$~1, в нём список папок из _export_
скрипт почему-то проигнорировал 2 последние папки: Zephi_Yupa2_SS_0038 Zephi_Yupa2_SS_0243 |
Цитата:
Код:
xcopy /t ".\_export_\wp_Zephi_st2_3_Rose\Material3\*" ".\Material3\" |
Цитата:
Цитата:
Цитата:
Код:
REM xcopy /t "%%~c\*" ".\%%~nc\" Цитата:
|
Цитата:
Код:
dir /b/s/ad .\_export_\* >dir.txt Цитата:
Цитата:
|
Цитата:
Цитата:
ДОБАВКА: скрипт меня спросил о замене файла M01.mat в корне\Material3, если я нажму да/всё, он просто всё заменит? Цитата:
|
Цитата:
Цитата:
|
Цитата:
Цитата:
извените за ре-пост скрипта, но я уже начинаю запутываться в вариантах, поэтому буду отталкиваться от этого: Код:
@echo off |
Цитата:
Цитата:
|
скрипт завершил работу: создал все папки (пустые) и 2 файла:
_only_mover_3_eng.$~1 _only_mover_3_eng.$~2 - пустой что теперь делать? |
Цитата:
Код:
@echo on Код:
_only_mover_test.$~1 Код:
_only_mover_test.bat >_only_mover_test.log 2>&1 |
Не понимаю, а разве скрипт из #70 не должен был ничего переносить? В нём ведь написано moved и.т.д
|
Tosyk, если файл .$~2 пустой, значит спискок файлов для перемещения не сформирован - либо в подкаталогах из .$~1 скрипт не нашел файлов, либо какая-то другая ошибка - вот это и надо теперь выяснить...
P.S. все эти движения называются отладкой (частей) кода скрипта на реальных данных |
|
Цитата:
- копируем в любой каталог два файла: Код:
_only_mover_test.$~1 - результат работы 1-й части скрипта (пост #63) - запускаем скрипт: Код:
_only_mover_test.bat >_only_mover_test.log 2>&1 немного подправил код в посте #73 - добавил кавычки, не знаю поможет или нет... попробуйте проделать описанную процедуру на другом компьютере без копирования всей папки, может в настройках дело, или код как-то странно копипастится с форума... |
попробовал с изменённым скриптом из поста #73, всё сработало, по крайней мере _only_mover_3_eng.$~2 теперь не пустой, приложил к посту файлы:
_only_mover_3_eng.$~1 -- 320 kb _only_mover_3_eng.$~2 -- 19000 kb _only_mover_3_eng.log -- 8500 kb http://dl.dropbox.com/u/9919707/scri...ipt_working.7z add: распаковал снова всё в папку "./_export_/". Может быть теперь попробуем какую-то полную версию скрипта? |
amel27, возможно ли продолжить наше обсуждение? вроде как в нужном направлении идём, хотелось бы закончить
|
Tosyk, за неделю уже забыл о чем речь....
3-й этап (требуется наличие файла .$~2): 4-й этап (требуется наличие файла .$~3): P.S. все изменения отразил в посте #43 |
спасибо, сейчас хочу запустить этот глобальный скрипт из поста #43, как я понял он то и сделает всю работу, так вот возможно ли сделать вывод в лог с отображением процесса в окне cmd?
add: в принципе не принципиально, я понял, что там особой информации нет в процессе. |
Ну что ж, скрипт работу завершил, вот последние строки:
Код:
Deleting source folder...OK не сочтите за наглость, в довершение вот, что хотелось бы: для удобства распознования переименованных файлов, можно ли к их имени добавлять в конце имя папки в которой они распологаются? например: уже есть первый файл: F:\il tempo\SkeletalMesh\sm.bmp второй файл распологается в: F:\il tempo\_export_\01_SenLab_02bossarea\SkeletalMesh\sm.bmp" он прошёл проверку на "разность" и копируется в папку с первым файлом с именем sm_0001.bmp, а можно ли к этому имени добавить папку его содержащую, чтобы было так: F:\il tempo\SkeletalMesh\sm_0001_01_SenLab_02bossarea.bmp ? |
Цитата:
Цитата:
P.S. уж если и модернизировать скрипт, то в сторону применения DIFF вместо размера Цитата:
|
Цитата:
Цитата:
|
Цитата:
Цитата:
|
Цитата:
скрипт в том состоянии, что есть сейчас делает свою работу превосходно, и спасибо вам за это!, единственное что хотелось добавить это как раз добавление к скопированным и перемещённым "копиям" имя расположения для упрощения идентификации и дальнейшей работы с файлами, а вот оставлять 60000 копий файлов совсем не хотеловь бы :) |
пришлось внести изменения в каждый шаг:
Код:
@echo off |
всё прошло успешно, скажите, а по какому шаблону она переименовывает копии?
Код:
... |
Цитата:
кстати, у меня MOVE не выдаёт сообщения о копировании, чтобы их подавить нужно добавить ">NUL": Код:
move "%%~c" "%%~a">nul |
Цитата:
вообщем-то всё отлично сработало и достаточно быстро, около 40 минут. спасибо огромное, всё такие командный интерпритатор ещё способен на многое! кстати я хотел бы вернуться к разговору об определении типа файла и его модификации по hex-значениям если вы не против. немного лирики: не нравится чёрное возникающее окно при исполнении скрипта, хочется чего то более "native to user" и очень хочу прогресс-бара. определённо добиться этого можно только в среде программирования, но какой? возможно вы знаете и подскажете? пока я остановился на delphi, взял у друга, delphi v7.3.3.3 |
Цитата:
Цитата:
P.S. многовато отличий, если не секрет - какая ОС и локализация? Цитата:
|
Цитата:
Цитата:
Цитата:
Код:
Delphi7_Lite_Full_Setup_v7.3.3.3v3(Build_2010-02-02).exe add: даже нашёл первый урок схожей тематики |
Цитата:
P.S. AutoIT - скриптовый язык, для продвинутого кодинга есть бесплатный Microsoft Visial Studio Express |
Цитата:
Цитата:
и если да, то могу я опубликовать ваш скрипт (тут #87) в ветке с Autoit? |
Цитата:
Цитата:
для экономии времени на обсуждение задачи можно дать линк на этот топик |
Цитата:
|
Tosyk, "объяснить суть задачи" и "описать его работу" - обязательное требование к оформлению любого топика, сам батник тут лишний - тот, кто пишет на AutoIT не обязан знать CMD, но линк дать можно...
|
|
amel27, приветствую, после сотен применений вашего скрипта появилась проблема: не создаётся ФАЙЛ.$~3.
Соответственно скрипт об это уведомляет и ничего переносить не хочет. скрипт использован из поста #87 ошибка такая: Код:
Scanning and preparing folders...OK Вопрос: с чем может быть связано сие? p.s.: прошу прощения за поднятие старой темы, но информация обновилась |
проверил наличие файла C:\WINDOWS\SYSTEM32\sort.exe, он на месте.
проблема решена в PATH переменных сред не было пути к C:\Windows\System32 после добавления его всё заработало, тема закрыта |
Время: 15:25. |
Время: 15:25.
© OSzone.net 2001-