Войти

Показать полную графическую версию : [решено] Раскидать файлы по папкам согласно дате в имени файла


spkvvs
11-11-2011, 10:28
Есть папка, где куча файлов, надо раскидать по папкам (создавая папки) согласно дате в имени файла

Имена файлов _ГГГГММДДЧЧССММ.jpg (пример: _20100401080242.jpg)
Нужное имя папки ГГГГММДД (пример: 20100410)

gora
11-11-2011, 11:17
раскидать по папкам »Команда "раскидать" заменена на "Copy"
@Echo Off
SetLocal EnableDelayedExpansion
:: Обрабатываемая папка
Set Folder=e:\Temp\Source
:: папка назначения
Set Out=e:\Temp\jpg

For /R "%Folder%" %%i In (*.jpg) Do (
Set ti=%%~ni
MD "%Out%\!ti:~1,8!" 2>Nul
Copy "%%i" "%Out%\!ti:~1,8!">Nul
)
Pause>Nul

megaloman
11-11-2011, 20:06
Если "раскидать" - это переместить, не создавая дубликата файла, то логичнее Copy заменить нa Move, и перемещать не по 1 файлу, а группой по маске (по дате). Цикл For у gora тогда можно переписать в видеFor /R "%Folder%" %%i In (*.jpg) Do (
IF EXIST "%%i" (
Set name=%%~ni
Set mask=!name:~1,8!
MD "%Out%\!mask!"
Move "%%~dpi?!mask!*%%~xi" "%Out%\!mask!\"
)
)
Ежели файлы всё же надо копировать, а не перемещать, то для копирования группой по маске For у gora можно переписать в виде For /R "%Folder%" %%i In (*.jpg) Do (
Set name=%%~ni
Set mask=!name:~1,8!
IF Not EXIST "%Out%\!mask!\*.*" MD "%Out%\!mask!"
IF Not EXIST "%Out%\!mask!\%%~nxi" Copy "%%~dpi?!mask!*%%~xi" "%Out%\!mask!\"
)
При повторном запуске этого батника перезапись уже скопированных файлов не производится

Reyter
07-09-2012, 11:06
Господа, поможите...
Нужно примерно то же самое, но:
1) дату нужно брать из атрибутов файла
2) имя создаваемых каталогов - "ДД-ММ" (и не спрашивайте, почему такое дурацкое имя. исторически сложилось)

gora
07-09-2012, 13:55
@Echo Off
SetLocal EnableDelayedExpansion
:: Обрабатываемая папка
Set Folder=e:\Temp\Source
:: папка назначения
Set Out=e:\Temp\jpg

For /R "%Folder%" %%i In (*.jpg) Do (
Set tim=%%~ti
Set tim=!tim:~0,5!
Set tim=!tim:.=-!
If Not Exist "%Out%\!tim!" MD "%Out%\!tim!"
Copy "%%~i" "%Out%\!tim!">Nul
)

Reyter
07-09-2012, 14:03
Спасибо! Работает :)

Reyter
07-09-2012, 14:37
Так... Условия задачи поменялись :blush2:

Файлы текстовые, содержимое (текст) каждого файла начинается с даты в формате DDMMYYYY. Т.е. первая строка выглядит как-то так:
30082012|#|08606|0004.......
Необходимо раскидать по тому же принципу, что и в задаче выше.
С меня пиво :)

gora
07-09-2012, 14:56
@Echo Off
SetLocal EnableDelayedExpansion
:: Обрабатываемая папка
Set Folder=e:\Temp\Source
:: папка назначения
Set Out=e:\Temp\jpg

For /R "%Folder%" %%a In (*.txt) Do (
Set flag=
For /F "usebackq tokens=* delims=" %%i In ("%%a") Do (
If Not Defined flag (
Set flag=1
Set tim=%%i
Set tim=!tim:~0,2!-!tim:~2,2!
If Not Exist "%Out%\!tim!" MD "%Out%\!tim!"
Copy "%%a" "%Out%\!tim!"
)
)
)

Reyter
07-09-2012, 15:00
:yahoo: Спасибо! Вы меня очень сильно выручили! :Beer:

4zz
23-02-2022, 09:49
Уважаемый megaloman!
Помогите победить проблему- в приведенном ниже примере, в случае присутствия пробелов в названии папки из которой запускается батник - он не срабатывает(( , а если пробелов нет, то все ОК.
Т.е. если папка "Январь 22" - не сработает, а если "Январь", то все хорошо.

@Echo Off
SetLocal EnableDelayedExpansion
:: Обрабатываемая папка
Set Folder="%cd%"
:: папка назначения
Set Out="%cd%"

For /R "%Folder%" %%i In (*.*) Do (
Set ti=%%~ni
MD "%Out%\!ti:~0,100!"
Move "%%i" "%Out%\!ti:~0,100!">Nul
)
Pause>Nul

megaloman
23-02-2022, 12:30
4zz, Попробуйте переставить кавычки:: Обрабатываемая папка
Set "Folder=%cd%"

:: папка назначения
Set "Out=%cd%"
И лучше бы Вы сформулировали Вашу задачу для оптимального решения

alpap
23-02-2022, 14:59
лучше бы »
лучше бы не использовать для работы с перемещением файлов одну и ту же папку и очень желательно при этом сам bat держать также не в папке где обрабатываются файлы.

4zz
23-02-2022, 18:56
Попробуйте переставить кавычки »

Ура! поехало!))
Спасибо!)

И лучше бы Вы сформулировали Вашу задачу для оптимального решения »
Задача простая - есть много файлов - счета за месяц обозванные по номерам домов или фамилиям, их нужно разбросать по одноименным папкам, чтобы чуть позже дополнить эти папки другими файлами этих же собственников/домов.

А может можно как-то упростить/автоматизировать дополнительно?

Допустим есть файлы test и test1 - это один и тот же собственник, просто разные счета - их нужно в одну папку - в моем варианте я батником создаю папки для счетов типа test и отдельно папки для счетов типа test1 применив к их созданию MD "%Out%\!ti:~0,-1%!", т.е. убираю единичку и создаю те же папки, что и в первом случае, но в другом месте, а потом вручную переношу (совмещаю) однотипные папки. Получаю, например папку TEST и в ней файлы test и test1

4zz
23-02-2022, 22:12
Надо конкретика, а не абстракция »

Приложил рисунки:
1.Был список файлов
2.Образованы папки
3. Список файлов в папках

megaloman
24-02-2022, 00:23
@Echo Off
cls
>nul Chcp 1251
Set "BoxIn=Z:\Users\Users\Desktop\Февраль 2022"
rem Set "BoxIn=%~dp0"
Set "BoxOut=%BoxIn%"

Set "Ext=xlsx"

If "%BoxIn:~-1%"=="\" Set "BoxIn=%BoxIn:~0,-1%"
If "%BoxOut:~-1%"=="\" Set "BoxOut=%BoxOut:~0,-1%"

For /F "usebackq delims=" %%f In (`2^>nul Dir "%BoxIn%\*.%Ext%" /B /A:-D ^| FindStr/I /R /V /C:"^.*([0-9]*)\.%Ext%$"`) Do (
2>nul Md "%BoxOut%\%%~nf"
>nul Move "%BoxIn%\%%f" "%BoxOut%\%%~nf\"
>nul Move "%BoxIn%\%%~nf(*)%%~xf" "%BoxOut%\%%~nf\"
)
Exit /B
Путь к входной и выходной папке укажите свой. Я здесь указал их одинаковыми. Если батник в исходной папке, уберите rem

4zz
24-02-2022, 01:00
megaloman,

ВЫ ВОЛШЕБНИК!!!
СПАСИБО!!! СУПЕР!!!)))

Julia111
23-01-2024, 16:26
Доброго дня! Помогите , пожалуйста, создать скрипт.
Есть файлы у которых название начинается с индексов «420004 …. 420005 …. 420021 … И так далее»
Подскажите как для каждого файла создать папку? Чтобы и файл туда переместился.

megaloman
24-01-2024, 16:03
@Echo Off &cls
>nul Chcp 1251
Set "BoxIn=Z:\Box_In"
Set "Mask=42*.*"
Set "BoxOut=Z:\Box_In"

For /F "usebackq delims=" %%f In (`2^>nul Dir "%BoxIn%\%Mask%" /B /A:-D ^| FindStr /I /R /B /C:"[0-9][0-9][0-9][0-9][0-9][0-9]"`) Do (
If Exist "%BoxIn%\%%f" (
Set "Name=%%f"
2>nul Call MD "%BoxOut%\%%Name:~0,6%%"
>nul Call Move /Y "%BoxIn%\%%Name:~0,6%%*.*" "%BoxOut%\%%Name:~0,6%%\"
)
)
pause
Exit /B




© OSzone.net 2001-2012