Показать полную графическую версию : Раскладка файлов по части имени
В папку периодично ложатся файлы разных расширений по названиям к примеру 18-04261, 05-03182. Необходимо их раскладывать по папкам названия которых равны первым цифрам после тире, по примерах 04 и 03 соответственно, так же после папки идет текущий месяц и год, после текущая дата. Пример 04/Septembe.20/03. Если папки не существуют, их создать. Заранее спасибо за помощь.
Dyaus, примеры реальных имён файлов приведите. С расширениями.
первым цифрам после тире »
Сколько именно нужно брать цифр? И здесь Вы пишете — «тире», а выше пишете дефисы.
так же после папки идет текущий месяц и год, после текущая дата. Пример 04/Septembe.20/03. »
Вот нахрена Зачем так? Почему не нормально, вменяемо и удобно — «…\2020.09\…»?!
папку/файл с "/" в названии не то чтобы невозможно создать, но я за такое не возьмусь. потому с форматом что-то нужно менять. или месяц-год-дата это вложенные папки?
Что по поводу совпадений имен файлов в одной и той же папке? заменять, спрашивать, игнорировать, переименовывать?
сколько цифр после тире брать (вроде как вижу что две, но мало ли...) если количество плавающее - как определять?
Где находятся папки по которым нужно раскладывать (или где их нужно создвавать)?
пока набросал что-то вот такое (с созданием папок в директории в которой ведется обработка, без добавления даты и без обработки совпадающих имен файлов):
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
pushd d:/tmp/
for /f "delims=" %%i in ('dir /b /a:-d *.txt') do (
for /f "tokens=2 delims=-" %%j in ("%%i") do (
set fname=%%j
if not exist "!fname:~0,2!" (
md "!fname:~0,2!"
)
echo move "%%i" "!fname:~0,2!/%%i"
)
)
popd
и да, без реального перемещения (echo перед move если убрать - будет с перемещением, но не советую пока не выяснены остальные вопросы)
Действительно дефисы. После дефиса нужны только две цифры. К сожалению в таком формате 04/Septembe.20/03 на работе существует давно так. Чаще всего файлы 01-05041, 03-08041, 25-02041 и т.д. расширения подавляюще xls, xlsx, doc, docx. Реже pdf, jpg, jpeg. В формате к примеру 01-05041.xlsx нужно переместить в папку 05/Septembe.20/04 , где 04 сегодняшнее число. Было бы лучше одинаковые файлы переименовать.
В смысле папка 05 в ней папка Septembe.20, в ней уже 04
В смысле папка 05 в ней папка Septembe.20, в ней уже папка 04
@echo off
for /f "tokens=1* delims==" %%a in ('"wmic path win32_localtime get Day,Month,Year /value|find "^=""') do set "%%a=0%%b"
set Year=%Year:~-5%
set Month=%Month:~-3%
set Day=%Day:~-3%
SETLOCAL ENABLEDELAYEDEXPANSION
pushd d:\tmp
for /f "delims=" %%i in ('dir /b /a:-d *.txt') do (
for /f "tokens=2 delims=-" %%j in ("%%i") do (
set fname=%%j
if not exist "!fname:~0,2!" (
md "!fname:~0,2!"
)
if not exist "!fname:~0,2!/%Month%.%Year%" (
md "!fname:~0,2!/%Month%.%Year%"
)
if not exist "!fname:~0,2!/%Month%.%Year%/%Day%" (
md "!fname:~0,2!/%Month%.%Year%/%Day%"
)
if not exist "!fname:~0,2!/%%i" (
echo move "%%i" "!fname:~0,2!/%Month%.%Year%/%Day%/%%i"
) else (
echo move "%%i" "!fname:~0,2!/%Month%.%Year%/%Day%/%%~ni_%random%.%%~xi"
)
)
)
popd
Только месяцы я переименовывать не буду, тем более что и названия у них судя по сентябрю весьма оригинальные. Где-то на форуме это уже обсуждалось и решение приводилось (емнип - даже не одно).
megaloman
04-09-2020, 15:05
@Echo Off
cls
Set "BoxIn=Z:\Box_In"
Set "BoxOut=Z:\Box_Out"
Call :FolderToday "DName"
FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%BoxIn%\??-?????.*" /O:N /B /A:-D`) DO (
Set "FName=%%~nxf"
>nul Call XCopy /Y "%BoxIn%\%%~nxf" "%BoxOut%\%%FName:~3,2%%\%DName%\"&&Del "%BoxIn%\%%~nxf"
)
Pause
Exit /B
:FolderToday
SetLocal
Set "M01=January"
Set "M02=February"
Set "M03=March"
Set "M04=April"
Set "M05=May"
Set "M06=June"
Set "M07=July"
Set "M08=August"
Set "M09=September"
Set "M10=October"
Set "M11=November"
Set "M12=December"
FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LocalDateTime /VALUE') DO SET "TDate=%%d"
Call Set "TDate=%%M%TDate:~4,2%%%.%TDate:~2,2%\%TDate:~6,2%"
EndLocal &Call Set "%~1=%TDate%"
Exit /B
Большое спасибо, буду пробовать
megaloman
04-09-2020, 15:56
Dyaus, В предыдущем посте при совпадении имён файлы будут переписываться. ИМХО, подозреваю, реально в одном дне совпадений быть не может. Однако, если такое возможно, то@Echo Off
cls
Set "BoxIn=Z:\Box_In"
Set "BoxOut=Z:\Box_Out"
Call :FolderToday "DName"
FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%BoxIn%\??-?????.*" /O:N /B /A:-D`) DO (
Set "FName=%%~nxf"
Call :MyMove "%BoxIn%\%%~nxf" "%BoxOut%\%%FName:~3,2%%\%DName%"
)
Pause
Exit /B
:MyMove
Set /A i=0
Set "FFn=%~n1"
Set "FFx=%~x1"
:Begin
If Not Exist "%~2\%FFn%%FFx%" GoTo :Out
Set /A i+=1
Set "FFn=%~n1(%i%)"
GoTo :Begin
:Out
If Not "%FFn%%FFx%"=="%~nx1" Ren "%~1" "%FFn%%FFx%"
>nul Call XCopy /Y "%BoxIn%\%FFn%%FFx%" "%BoxOut%\%%FName:~3,2%%\%DName%\"&&Del "%BoxIn%\%FFn%%FFx%"
Exit /B
:FolderToday
SetLocal
Set "M01=January"
Set "M02=February"
Set "M03=March"
Set "M04=April"
Set "M05=May"
Set "M06=June"
Set "M07=July"
Set "M08=August"
Set "M09=September"
Set "M10=October"
Set "M11=November"
Set "M12=December"
FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LocalDateTime /VALUE') DO SET "TDate=%%d"
Call Set "TDate=%%M%TDate:~4,2%%%.%TDate:~2,2%\%TDate:~6,2%"
EndLocal &Call Set "%~1=%TDate%"
Exit /B
К сожалению в таком формате 04/Septembe.20/03 на работе существует давно так. »
Лучше посидеть и один раз переделать под структуру вида ГГГГ.ММ — так у Вас хоть сортировка в Проводнике будет нормальная.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.