Войти

Показать полную графическую версию : Разложить файлы из кучи по каталогам согласно образцу


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.

Судя по нему, происходит некорректная работа с русскими символами. Как это решить?

Iska
11-03-2011, 14:36
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
Может кто-нибудь помочь с кодом?

sov44
14-07-2012, 11:26
Необходимо разложить файлы по 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

sov44
14-07-2012, 12:52
kiripanda, всё равно в папках не по 10 файлов.

kiripanda
14-07-2012, 13:11
у меня по 10

sov44
14-07-2012, 13:37
kiripanda, разобрался, были скрытые файлы :)




© OSzone.net 2001-2012