Компьютерный форум 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=288819)

Systems 02-10-2014 11:43 2409856

Сортирование файлов по папкам (копирование в многоуровневые папки по дате создания)
 
Здравствуйте, помогите пожалуйста с батником. За месяц создается несколько тысяч файлов, и сортировать их вручную довольно долго.
Нужно следующие:
Есть папка с большим кол-вом файлов вида:

M11_Pob87_Cam_01_20131001_135437_0954.avi
M11_Pob87_Cam_02_20131001_135504_1006.avi
M11_Pob87_Cam_03_20141001_151822_0813.avi
M11_Pob87_Cam_04_20141001_155122_0922.avi
M11_Pob87_Cam_05_20141001_180623_0949.avi
M11_Pob87_Cam_06_20141001_185636_0995.avi

M11_Pob87_Cam_01 - название камеры
20141001 - дата создания файла
135437_0954 - временная метка

Нужно чтобы скрипт создал многоуровневый каталог с папками и подпапками следующего вида
Год
Cam_**
Месяц
День
Дату создания можно брать из названия файла или определить скриптом, как будет проще
Заранее благодарен за помощь!

Iska 02-10-2014 12:08 2409869

Цитата:

Цитата Systems
M11_Pob87_Cam_01 - название камеры »

А «M11_Pob87_Cam_02» — название уже другой камеры?

Georgio 02-10-2014 12:23 2409878

Код:

@echo off

set "directory=D:\Camera"

pushd "%directory%"
for /f "delims=" %%i in ('2^>nul dir /a-d/b *.avi') do (
 set file=%%i
 call set "folder=%%file:~17,4%%\%%file:~10,6%%\%%file:~21,2%%\%%file:~23,2%%"
 2>nul call md "%%folder%%"
 >nul call move "%%i" "%%folder%%"
 )
popd

exit /b


Systems 02-10-2014 12:43 2409891

Цитата:

Цитата Iska
А «M11_Pob87_Cam_02» — название уже другой камеры? »

Да, это название следующей камеры, может быть до Cam_32
M11_Pob87 - тоже может меняться, это название объекта, где установлена камера

Iska 02-10-2014 12:49 2409901

Цитата:

Цитата Systems
M11_Pob87 - тоже может меняться, это название объекта, где установлена камера »

Приведите примеры. А то вдруг длина имён разная окажется.

Systems 02-10-2014 12:58 2409905

Цитата Iska:
Приведите примеры. А то вдруг длина имён разная окажется. »
Действительно длина имён разная
M6_Ubi14
M11_Pob87
M10_Pro226

И папка просмотра тоже многоуровневая, для примера
e:\Cam_02\Video\Event\20141001\09
\10
\11
\13
e:\Cam_02\Video\Event\20141002\09
\10
\11
\13

e:\Cam_03\Video\Event\20141001\09
\11
\12
\14
e:\Cam_03\Video\Event\20141002\09
\11
\12
\14
А пересортировать нужно все из папки е:\

И еще просьба, можно самому указывать папку где создавать катагоги
:: Обрабатываемая папка
set "directory=D:\Camera"
:: папка назначения
Set "Out=d:\_Backup_"

Georgio 02-10-2014 13:39 2409930

Код:

@echo off

:: Обрабатываемая папка
set "directory=D:\Camera"

:: Папка назначения
set "out=D:\_Backup_"

pushd "%directory%"
for /f "delims=" %%i in ('2^>nul dir /a-d/b *.avi') do (
 set file=%%i
 call set "folder=%%file:~-24,4%%\%%file:~-31,6%%\%%file:~-20,2%%\%%file:~-18,2%%"
 2>nul call md "%out%\%%folder%%"
 >nul call move "%%i" "%out%\%%folder%%"
 )
popd

exit /b


Systems 02-10-2014 17:45 2410105

Извените что долго непроверял, пришлось отлучиться из офиса по работе.
Несовсем правильно отрабатывает.
Если указать
:: Обрабатываемая папка
set "directory=e:" не работает вообще

Нужно указивать конкретно папку
:: Обрабатываемая папка
set "directory=e:\Cam_02\Video\Event\20141001\14\" - тогда все нормально.

Можно как то это побороть

Georgio 02-10-2014 17:58 2410119

Цитата:

Цитата Systems
Есть папка с большим кол-вом файлов »

Цитата:

Цитата Systems
Нужно указивать конкретно папку
:: Обрабатываемая папка
set "directory=e:\Cam_02\Video\Event\20141001\14\" - тогда все нормально. »


Systems, значит, всё-таки есть папки, а не папка?

Systems 02-10-2014 18:08 2410127

Я приводил пример структуры веше
И папка просмотра тоже многоуровневая, для примера
e:\Cam_02\Video\Event\20141001\09
\10
\11
\13
e:\Cam_02\Video\Event\20141002\09
\10
\11
\13

e:\Cam_03\Video\Event\20141001\09
\11
\12
\14
e:\Cam_03\Video\Event\20141002\09
\11
\12
\14
А пересортировать нужно все из папки на диске е:, f: и так далее

Georgio 02-10-2014 18:49 2410141

Systems, пробуйте:


Код:

@echo off

:: Обрабатываемый диск
set "drive=E:"

:: Папка назначения
set "out=E:\_Backup_"

for /f "delims=" %%i in ('2^>nul dir /ad/b "%drive%\Cam_*"') do (
 for /f "delims=" %%j in ('2^>nul dir /a-d/b/s "%drive%\%%i\*.avi"') do (
  set file=%%~nj
  call set "folder=%%file:~-20,4%%\%%file:~-27,6%%\%%file:~-16,2%%\%%file:~-14,2%%"
  2>nul call md "%out%\%%folder%%"
  >nul call move "%%j" "%out%\%%folder%%"
  )
 )

exit /b


.

Systems 02-10-2014 19:07 2410150

Спасибо огромное, все работает просто замечательно!

Systems 03-10-2014 09:18 2410422

Добрый день, еще небольшая просьба, после переноса файлов остаються папки с файлами *.log, для прмера evt_20141001_151835022.log
Можно в этом же скрипте после переноса *.avi удалить все папки с оставшимися файлами.
Удалить нужно папки которые находятся по вложению после e:\Cam_02\Video\Event, для примера
e:\Cam_01\Video\Event\20141001\09 - нужно удалить все папки с оставшимися в них файлами 20141001\09, 20141001\10, 20141002\08, 20141002\11 и так далее
e:\Cam_02\Video\Event\20141001\09 - нужно удалить все папки с оставшимися в них файлами 20141001\08, 20141001\13, 20141002\12, 20141002\14 и так далее

Georgio 03-10-2014 09:59 2410441

Systems, дополнил:


Код:

@echo off

:: Обрабатываемый диск
set "drive=E:"

:: Папка назначения
set "out=E:\_Backup_"

for /f "delims=" %%i in ('2^>nul dir /ad/b "%drive%\Cam_*"') do (
 for /f "delims=" %%j in ('2^>nul dir /a-d/b/s "%drive%\%%i\*.avi"') do (
  set file=%%~nj
  call set "folder=%%file:~-20,4%%\%%file:~-27,6%%\%%file:~-16,2%%\%%file:~-14,2%%"
  2>nul call md "%out%\%%folder%%"
  >nul call move "%%j" "%out%\%%folder%%"
  )
 for /f "delims=" %%j in ('2^>nul dir /ad/b "%drive%\%%i\Video\Events"') do (
  rd /q/s "%drive%\%%i\Video\Events\%%j"
  )
 )

exit /b


.

Systems 03-10-2014 10:28 2410449

Ничего неизменилось в работе, файлы перенес а папки с мусором остальсь.

Georgio 03-10-2014 10:54 2410470

Systems, я просто из-за невнимательности вместо "Event" написал "Events". Вот так правильно:


Код:

@echo off

:: Обрабатываемый диск
set "drive=E:"

:: Папка назначения
set "out=E:\_Backup_"

for /f "delims=" %%i in ('2^>nul dir /ad/b "%drive%\Cam_*"') do (
 for /f "delims=" %%j in ('2^>nul dir /a-d/b/s "%drive%\%%i\*.avi"') do (
  set file=%%~nj
  call set "folder=%%file:~-20,4%%\%%file:~-27,6%%\%%file:~-16,2%%\%%file:~-14,2%%"
  2>nul call md "%out%\%%folder%%"
  >nul call move "%%j" "%out%\%%folder%%"
  )
 for /f "delims=" %%j in ('2^>nul dir /ad/b "%drive%\%%i\Video\Event"') do (
  rd /q/s "%drive%\%%i\Video\Event\%%j"
  )
 )

exit /b


.

Systems 03-10-2014 11:16 2410483

Спасибо огромное, все работает.
Со своей стороны я то же недосмотрел что в некоторых каталогах есть еще одна папка Record - которую нужно очищать по тому же принципу что и Event
e:\Cam_01\Video\Record\20141001\09 - нужно удалить все папки с оставшимися в них файлами 20141001\09, 20141001\10, 20141002\08, 20141002\11 и так далее
Можно еще и это добавить в скрипт

Georgio 03-10-2014 11:33 2410490

Код:

@echo off

:: Обрабатываемый диск
set "drive=E:"

:: Папка назначения
set "out=E:\_Backup_"

for /f "delims=" %%i in ('2^>nul dir /ad/b "%drive%\Cam_*"') do (
 for /f "delims=" %%j in ('2^>nul dir /a-d/b/s "%drive%\%%i\*.avi"') do (
  set file=%%~nj
  call set "folder=%%file:~-20,4%%\%%file:~-27,6%%\%%file:~-16,2%%\%%file:~-14,2%%"
  2>nul call md "%out%\%%folder%%"
  >nul call move "%%j" "%out%\%%folder%%"
  )
 for /f "delims=" %%j in ('2^>nul dir /ad/b "%drive%\%%i\Video\Event" "%drive%\%%i\Video\Record"') do (
  2>nul rd /q/s "%drive%\%%i\Video\Event\%%j"
  2>nul rd /q/s "%drive%\%%i\Video\Record\%%j"
  )
 )

exit /b


Systems 03-10-2014 11:37 2410492

Спасибо огромное


Время: 23:20.

Время: 23:20.
© OSzone.net 2001-