Показать полную графическую версию : Разложить файлы из кучи по каталогам согласно образцу
Maartimus
11-03-2011, 00:26
Помогите, пожалуйста, решить следующую задачу: нужно из общей свалки файлов разложить их по каталогам, согласно образцу.
Поясню на примере:
1. Есть каталог-образец. Он содержит следующие файлы
D:/страны_образец/Европа/Германия.txt
D:/страны_образец/Европа/Франция.txt
D:/страны_образец/Европа/Россия.txt
D:/страны_образец/Африка/Египет.txt
D:/страны_образец/Африка/Кения.txt
2. Есть исходный каталог, с которым надо работать. Он содержит следующие файлы:
D:/страны_разрбрать/Германия.txt
D:/страны_разрбрать/Россия.txt
D:/страны_разрбрать/Кения.txt
3. Нужно получить 3-ий каталог со следующей структурой (берем файл и переносим его в каталожную структуру согласно образцу):
D:/страны_разобраны/Европа/Германия.txt
D:/страны_разобраны/Европа/Россия.txt
D:/страны_разобраны/Африка/Кения.txt
Важное замечание: В каталоге Страны_Разобрать не могуть быть файлы, отсутствующие в каталоге страны_образец.
SendMessage
11-03-2011, 06:26
@echo off
set "FPattern=D:\страны_образец"
set "FIn=D:\страны_разрбрать"
set "FOut=D:\страны_разобраны"
for /f "delims=" %%a in ('dir /s/b/a-d "%FIn%\*.txt"') do (
for /f "tokens=3 delims=\" %%b in ('dir /a-d/b/s "%FPattern%\%%~nxa"') do (
if not exist "%FOut%\%%b" md "%FOut%\%%b"
move "%%a" "%FOut%\%%b"
)
)
tokens=number в зависимости от глубины нахождения папок с континентами. В данном случае 3.
Maartimus
11-03-2011, 11:15
tokens=number в зависимости от глубины нахождения папок с континентами. В данном случае 3.
Спасибо, @SendMessage.
Попробовал этот скрипт.
Создал описанную мной структуру, создал батник, в который вставил приложенный код. Запускаю. Окно cmd открывается и сразу закрывается. Каталог страны_разобраны пуст.
Я что-то делаю неправильно?
Как мониторить работу скрипта?
Можно ли вставить отладочные сообщения, которые требуют нажатия, например, пробела?
SendMessage
11-03-2011, 11:57
Попробовал этот скрипт.
Создал описанную мной структуру, создал батник, в который вставил приложенный код. Запускаю. Окно cmd открывается и сразу закрывается. Каталог страны_разобраны пуст.
Я что-то делаю неправильно? »
Откуда мне знать? Вы ведь не привели код своего батника.
Я, со своей стороны, прежде чем писать скрипт, всегда его проверяю - у меня отработал без проблем.
Как мониторить работу скрипта?
Можно ли вставить отладочные сообщения, которые требуют нажатия, например, пробела? »
Закомментировать ::@echo off.
Поставить pause после строчек, которые вызывают подозрения на некорректность работы.
PS. Кстати, сейчас заметил, у Вас слэш в другую сторону смотрит. Вы так и пишете?
D:/страны_образец/Европа/
Maartimus
11-03-2011, 14:17
Слэши смотрят в правильную сторону, я скопипастил Ваш код, поменяв только логический диск в адресе.
Поставил паузу в конце выполнения скрипта и снял скриншот окна cmd.
Судя по нему, происходит некорректная работа с русскими символами. Как это решить?
Maartimus, пакетные файлы надо сохранять в кодировке 866 любым поддерживающим это редактором.
Maartimus
11-03-2011, 14:57
пакетные файлы надо сохранять в кодировке 866 любым поддерживающим это редактором. »
Сделал -- помогло, спасибо.
Скрипт отрабатывает, файлы, судя по всему находит, но не перемещает.
Как выловить проблему?
Прикладываю скриншот скрипта, total commander и результат работы cmd
SendMessage
12-03-2011, 03:07
Maartimus, а почему у вас tokens=10 стоит? Когда, судя по скриншоту ТС, нужно 3 - как у меня в скрипте и написано.
SendMessage
12-03-2011, 03:45
Не хотелось усложнять скрипт, но придется. Теперь Вам не надо ничего править, кроме (если нужно) путей, по которым находятся Ваши папки.
@echo off
setlocal enabledelayedexpansion
set "FPattern=D:\страны_образец"
set "FIn=D:\страны_разрбрать"
set "FOut=D:\страны_разобраны"
for /f "delims=" %%a in ('dir /s/b/a-d "%FIn%\*.txt"') do (
for /f "delims=" %%b in ('dir /a-d/b/s "%FPattern%\%%~nxa"') do set "fp=%%~dpb" & call:MoveFile "!fp:~,-1!" "%%a"
)
goto:eof
:MoveFile
if not exist "%FOut%\%~n1" md "%FOut%\%~n1"
move %2 "%FOut%\%~n1"
exit /b
Maartimus
12-03-2011, 11:32
Maartimus, а почему у вас tokens=10 стоит? Когда, судя по скриншоту ТС, нужно 3 - как у меня в скрипте и написано. »
В реальной задаче каталогов больше. Увеличил, чтобы потом не забыть. Это ведь влияет на глубину просмотра, но не на логику, так что из-за этого дополнительных проблем быть не должно.
SendMessage
12-03-2011, 11:51
В реальной задаче каталогов больше. Увеличил, чтобы потом не забыть. Это ведь влияет на глубину просмотра, но не на логику, так что из-за этого дополнительных проблем быть не должно. »
Проблемы будут, если не будет точного совпадения по глубине. Чем этот мой скрипт и плох. Он не универсален. Но в последней редакции берется именно последний по глубине каталог - и здесь уже проблем не должно возникать (я надеюсь :) ).
Maartimus
12-03-2011, 12:17
Проблемы будут, если не будет точного совпадения по глубине. Чем этот мой скрипт и плох. Он не универсален. Но в последней редакции берется именно последний по глубине каталог - и здесь уже проблем не должно возникать (я надеюсь ). »
Тогда понятно почему у меня не заработало :).
Правильная поговорка есть "работает -- не трогай", но я её не послушал. :)
Зато теперь есть вторая редакция скрипта. Сейчас протестирую. Отпишу о результатах.
Все работает как нужно.
Спасибо!
Maartimus
14-03-2011, 11:12
Ещё вопрос.
А как сохранить структуру вложенности каталогов?
Например.
Каталог-образец:
D:\страны_образец\eвропа\россия\московская_область\балашиха.txt
D:\страны_образец\eвропа\россия.txt
Исходный каталог:
D:\страны_разрбрать\балашиха.txt
D:\страны_разрбрать\россия.txt
Последний вариант скрипта возвращает:
D:\страны_образец\московская_область\балашиха.txt
D:\страны_образец\eвропа\россия.txt
То есть отсутствует часть каталога, выделенного жирным в каталоге-образце.
Подскажите изменения, для сохранения полного пути?
Maartimus
16-03-2011, 11:30
Может кто-нибудь помочь с кодом?
Необходимо разложить файлы по 10 штук в папку. Папки создавать по потребности. Скрипт написал, но почему-то количество файлов в папках не равняется 10. Подскажите, где ошибка?
@echo off
setlocal enabledelayedexpansion
set maxfiles=10
set dr="c:\перевалка"
set m=1
md "%~dp0name%m%"
for /f "delims=" %%a in ('dir "%dr%" /b/a-d') do (
if not exist "%~dp0name!m!" md "%~dp0name!m!"
set /a n +=1
if "!n!"=="%maxfiles%" (set n=&set /a m +=1) else (copy "%dr%\%%a" "%~dp0name!m!")
)
pause
kiripanda
14-07-2012, 12:32
@echo off
setlocal enabledelayedexpansion
set maxfiles=10
set dr="z:\perevalka"
set m=1
set n=0
for /f "delims=" %%a in ('dir "%dr%" /b/a-d') do (
if "!n!"=="%maxfiles%" (set n=0 &set /a m+=1)
if not exist "%~dp0name!m!" md "%~dp0name!m!"
copy "%dr%\%%a" "%~dp0name!m!"
set /a n+=1
)
pause
kiripanda, всё равно в папках не по 10 файлов.
kiripanda
14-07-2012, 13:11
у меня по 10
kiripanda, разобрался, были скрытые файлы :)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.