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

jokerbleck 15-02-2012 11:44 1859239

Создание папок по расширению файлов
 
Здрасте!
Проблемма такая. имеется папка с ОГРОМНЫМ кол-вом файлов разного расширения (семенные фото, видео, документы... всего 65 Гигов)
необходим универсальный BAT/CMD файл для того чтоб в корневом каталоге провести сортировку ВСЕХ файлов, и расфасовать их по расширению и дате создания
НАПРИМЕР:
...Корневая папка/%DATE%/расширение1/*.расширение1
...Корневая папка/%DATE%/расширение2/*.расширение2
...Корневая папка/%DATE%/расширение3/*.расширение3

Зарание благодарю....
ПС, Поиск результата не дал...

megaloman 15-02-2012 12:46 1859275

jokerbleck,
Код:

@Echo Off
rem Даты в системе должны быть формата dd.mm.yyyy, иначе решение надо дорабатывать под конкретный случай

Set In=E:\Delete\Огромное количество
Set Out=E:\Delete\Корневая папка

SetLocal EnableExtensions
SetLocal EnableDelayedExpansion

FOR %%k IN ("%In%\*.*") DO (
        Set tFile=%%~tk
        Set tFile=!tFile:~6,4!_!tFile:~3,2!_!tFile:~0,2!
        Set xFile=%%~xk
        Set xFile=!xFile:~1,255!
        If Not Exist "%Out%\!tFile!\!xFile!" Md "%Out%\!tFile!\!xFile!"
        Move /Y "%%k" "%Out%\!tFile!\!xFile!\"
)


jokerbleck 16-02-2012 03:56 1859845

Спасибо... однако под корневой папкой я понимал папку в коророй лежит батник, а не корень диска.
Цитата:

Цитата megaloman
If Not Exist "%Out%\!tFile!\!xFile!" Md "%Out%\!tFile!\!xFile!" Move /Y "%%k" "%Out%\!tFile!\!xFile!\" »

тут надо поменять так... если не прав поправте:


@Echo Off

SetLocal EnableExtensions
SetLocal EnableDelayedExpansion

FOR %%k IN ("%In%\*.*") DO (
Set tFile=%%~tk
Set tFile=!tFile:~6,4!_!tFile:~3,2!_!tFile:~0,2!
Set xFile=%%~xk
Set xFile=!xFile:~1,255!
If Not Exist "%cd%\%Out%\!tFile!\!xFile!" Md "%cd%\%Out%\!tFile!\!xFile!"
Move /Y "%%k" "%cd%\%Out%\!tFile!\!xFile!\"
)

jokerbleck 16-02-2012 05:45 1859858

Хм... не получается...
проблемма в создании папок.

Iska 16-02-2012 09:17 1859918

Цитата:

Цитата jokerbleck
однако под корневой папкой я понимал папку в коророй лежит батник, а не корень диска. »

Старайтесь при общении использовать общепринятые термины.

El Sanchez 16-02-2012 12:44 1860054

Цитата:

Цитата jokerbleck
однако под корневой папкой я понимал папку в коророй лежит батник »

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

Вариант №2:
Код:

@Echo Off
SetLocal
Set Source=C:\Source

For /F "Tokens=*" %%A In ('Dir /B /S /AD "%Source%" 2^>nul') Do For /F "Tokens=1,3*" %%B In ('Dir /A-D /TC /-C "%%A\*.*" 2^>nul^|Find "."^|Find ":"^|Find /v "\"') Do Call :_Proc "%%A\%%D" "%%B"
For /F "Tokens=1,3*" %%A In ('Dir /A-D /TC /-C "%Source%\*.*" 2^>nul^|Find "."^|Find ":"^|Find /v "\"') Do Call :_Proc "%Source%\%%C" "%%A"
GoTo :EoF

Set Ext=noext%~x1
Set Output=%Source%\%~2\%Ext:*noext.=%
If Not Exist "%Output%" MD "%Output%" 2>nul
If /i Not "%~1"=="%Output%\%~nx1" If Exist "%Output%\%~nx1" (
        For /F "Tokens=1* Delims=:" %%A In ('Dir /B /A-D "%Output%\%~n1(*)%~x1" "%Output%\%~nx1" 2^>nul^|FindStr /in .') Do If Not Exist "%Output%\%~n1(%%A)%~x1" (Echo:Move "%~1" to "%Output%\%~n1(%%A)%~x1"&Move "%~1" "%Output%\%~n1(%%A)%~x1" >nul)
) Else (
        Echo:Move "%~1" to "%Output%\%~nx1"&Move "%~1" "%Output%\%~nx1" >nul
)

P.S. jokerbleck, потренируйтесь сначала на папке с малым количеством файлов и папок, потом натравите на свои 65 гигов.
P.P.S. После сортировки останутся пустые исходные папки, которые можно удалить.

megaloman 16-02-2012 13:06 1860067

Цитата:

Спасибо... однако под корневой папкой я понимал папку в коророй лежит батник, а не корень диска.
jokerbleck, так как я телепатиям не обучен :lol: то я Вам предоставил возможноять явным образом указать путь, где надо создавать папки. Если Вы хотите создавать папки там, откуда запускается батник, то вот 2 варианта, как определить исходное данное-переменную Out вместо того, как это было сделано у меня
Код:

Set Out=.
Код:

Set Out=%~dp0
Set Out=%Out:~0,-1%

В остальном в коде ничего менять не надо
Если батник, огромное число файлов, папки, в которые расфасовываются файлы, находятся вместе, то вот решение (в нём батник не попытается сам себя отсортировать - он останется на месте)
Код:

@Echo Off
rem Даты в системе должны быть формата dd.mm.yyyy, иначе решение надо дорабатывать под конкретный случай

SetLocal EnableExtensions
SetLocal EnableDelayedExpansion

Set Bat=%0

FOR %%k IN (*.*) DO (
    If Not "%%k"=="%Bat%" ( 
        Set tFile=%%~tk
        Set tFile=!tFile:~6,4!_!tFile:~3,2!_!tFile:~0,2!
        Set xFile=%%~xk
        Set xFile=!xFile:~1,255!
        If Not Exist "!tFile!\!xFile!" Md "!tFile!\!xFile!"
        Move /Y "%%k" "!tFile!\!xFile!\"
    )
)


jokerbleck 20-02-2012 05:40 1862493

БОЛЬШОЕ Спасибо!
Порывшись на форуме своял несколько CMD/BATников.
Вот собственно что получилось:
1-й, проверяем на наличие ВСКЛ знака в папке если есть меняем на свободное

**************
:1
ren *!*.* %random%.*
goto :1
***************

2-й, изменяем имена всех файлов на "image.*" (фильтр и имя потчеркнул)
************************
@echo off
setlocal enableextensions enabledelayedexpansion

set /a lCount = 0

for /f "delims=*" %%i in ('dir /b /s "*.*"') do (
set /a lCount += 1
ren "%%i" "image!lCount!%%~xi"
)

endlocal
exit /b 0
************************

3-й, копируем в отдельную папку (имена присвоены, совпадений не будет)

*************************
md %cd%\filtr
cls

Set From=%CD%
Set To=%cd%\filtr

FOR /R %From% %%f IN (*.*) DO Move /Y "%%f" "%To%\"
pause

***************************

4-й, поправленный от megaloman (изменил порядок создания папок)
***************************
@Echo Off
rem Даты в системе должны быть формата dd.mm.yyyy, иначе решение надо дорабатывать под конкретный случай

Set Out=%~dp0
Set Out=%Out:~0,-1%

SetLocal EnableExtensions
SetLocal EnableDelayedExpansion

Set Bat=%0

FOR %%k IN (*.*) DO (
If Not "%%k"=="%Bat%" (
Set tFile=%%~tk
Set tFile=!tFile:~6,4!_!tFile:~3,2!_!tFile:~0,2!
Set xFile=%%~xk
Set xFile=!xFile:~1,255!
If Not Exist "!xFile!\!tFile!" Md "!xFile!\!tFile!"
Move /Y "%%k" "!xFile!\!tFile!\"
)
)
***********************************

Вот я имею несколько батников, теперь появился интерес в обьединении их в один.
однако некоторые ватники "зациклины" я не вижу решения... помогите мне /Плиззззззззззз

Iska 20-02-2012 07:16 1862513

jokerbleck, прочтите, пожалуйста, справку по тэгам BBCode и используйте их. В данном случае — тэг «code» для оформления кода в предыдущем посте.


Время: 04:51.

Время: 04:51.
© OSzone.net 2001-