CMD/BAT - Раскладка файлов по части имени

Ответить
Аватара пользователя
Dyaus

CMD/BAT - Раскладка файлов по части имени

Сообщение Dyaus »

В папку периодично ложатся файлы разных расширений по названиям к примеру 18-04261, 05-03182. Необходимо их раскладывать по папкам названия которых равны первым цифрам после тире, по примерах 04 и 03 соответственно, так же после папки идет текущий месяц и год, после текущая дата. Пример 04/Septembe.20/03. Если папки не существуют, их создать. Заранее спасибо за помощь.
Аватара пользователя
Iska

Re: CMD/BAT - Раскладка файлов по части имени

Сообщение Iska »

Dyaus, примеры реальных имён файлов приведите. С расширениями.




Цитата Dyaus:



первым цифрам после тире
CMD/BAT - Раскладка файлов по части имени




Сколько именно нужно брать цифр? И здесь Вы пишете — «тире», а выше пишете дефисы.




Цитата Dyaus:



так же после папки идет текущий месяц и год, после текущая дата. Пример 04/Septembe.20/03.
CMD/BAT - Раскладка файлов по части имени




Вот нахрена Зачем так? Почему не нормально, вменяемо и удобно — «…\2020.09\…»?!
Аватара пользователя
Elven

Re: CMD/BAT - Раскладка файлов по части имени

Сообщение Elven »

папку/файл с "/" в названии не то чтобы невозможно создать, но я за такое не возьмусь. потому с форматом что-то нужно менять. или месяц-год-дата это вложенные папки?

Что по поводу совпадений имен файлов в одной и той же папке? заменять, спрашивать, игнорировать, переименовывать?

сколько цифр после тире брать (вроде как вижу что две, но мало ли...) если количество плавающее - как определять?

Где находятся папки по которым нужно раскладывать (или где их нужно создвавать)?

пока набросал что-то вот такое (с созданием папок в директории в которой ведется обработка, без добавления даты и без обработки совпадающих имен файлов):



Код:

Код: Выделить всё

@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 если убрать - будет с перемещением, но не советую пока не выяснены остальные вопросы)
Аватара пользователя
Dyaus

Re: CMD/BAT - Раскладка файлов по части имени

Сообщение Dyaus »

Действительно дефисы. После дефиса нужны только две цифры. К сожалению в таком формате 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 сегодняшнее число. Было бы лучше одинаковые файлы переименовать.
Аватара пользователя
Dyaus

Re: CMD/BAT - Раскладка файлов по части имени

Сообщение Dyaus »

В смысле папка 05 в ней папка Septembe.20, в ней уже 04



В смысле папка 05 в ней папка Septembe.20, в ней уже папка 04
Аватара пользователя
Dyaus

Re: CMD/BAT - Раскладка файлов по части имени

Сообщение Dyaus »

Код:

Код: Выделить всё

@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

Re: CMD/BAT - Раскладка файлов по части имени

Сообщение megaloman »

Код:

Код: Выделить всё

@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
Аватара пользователя
Dyaus

Re: CMD/BAT - Раскладка файлов по части имени

Сообщение Dyaus »

Большое спасибо, буду пробовать
Аватара пользователя
Dyaus

Re: CMD/BAT - Раскладка файлов по части имени

Сообщение Dyaus »

Dyaus, В предыдущем посте при совпадении имён файлы будут переписываться. ИМХО, подозреваю, реально в одном дне совпадений быть не может. Однако, если такое возможно, то


При совпадении имён в одном дне файлы будут переименованы:

имя(1).расширение имя(2).расширение и т д

[spoiler]Код:
[/spoiler]

Код: Выделить всё

@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
Аватара пользователя
Iska

Re: CMD/BAT - Раскладка файлов по части имени

Сообщение Iska »

Цитата Dyaus:



К сожалению в таком формате 04/Septembe.20/03 на работе существует давно так.
CMD/BAT - Раскладка файлов по части имени




Лучше посидеть и один раз переделать под структуру вида ГГГГ.ММ — так у Вас хоть сортировка в Проводнике будет нормальная.
Ответить

Вернуться в «Скриптовые языки администрирования Windows»