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

spkvvs 11-11-2011 10:28 1792837

Раскидать файлы по папкам согласно дате в имени файла
 
Есть папка, где куча файлов, надо раскидать по папкам (создавая папки) согласно дате в имени файла

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

gora 11-11-2011 11:17 1792864

Цитата:

Цитата spkvvs
раскидать по папкам »

Команда "раскидать" заменена на "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 1793229

Если "раскидать" - это переместить, не создавая дубликата файла, то логичнее 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 1984635

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

gora 07-09-2012 13:55 1984752

Код:

@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 1984756

Спасибо! Работает :)

Reyter 07-09-2012 14:37 1984774

Так... Условия задачи поменялись :blush2:

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

gora 07-09-2012 14:56 1984781

Код:

@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 1984784

:yahoo: Спасибо! Вы меня очень сильно выручили! :Beer:

4zz 23-02-2022 09:49 2980636

Уважаемый 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 2980646

4zz, Попробуйте переставить кавычки
Код:

:: Обрабатываемая папка
Set "Folder=%cd%"

:: папка назначения
Set "Out=%cd%"

И лучше бы Вы сформулировали Вашу задачу для оптимального решения

alpap 23-02-2022 14:59 2980660

Цитата:

Цитата megaloman
лучше бы »

лучше бы не использовать для работы с перемещением файлов одну и ту же папку и очень желательно при этом сам bat держать также не в папке где обрабатываются файлы.

4zz 23-02-2022 18:56 2980689

Цитата:

Цитата megaloman
Попробуйте переставить кавычки »

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

Цитата:

Цитата megaloman
И лучше бы Вы сформулировали Вашу задачу для оптимального решения »

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

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

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

4zz 23-02-2022 22:12 2980708

Вложений: 3
Цитата:

Цитата megaloman
Надо конкретика, а не абстракция »

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

megaloman 24-02-2022 00:23 2980714

Код:

@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 2980715

megaloman,

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

Julia111 23-01-2024 16:26 3023082

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

megaloman 24-01-2024 16:03 3023119

Код:

@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



Время: 21:19.

Время: 21:19.
© OSzone.net 2001-