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

Metallor 12-03-2016 00:41 2615120

Поместить каждый файл в одноименную папку.
 
Здравствуйте, помогите пожалуйста в решении следующей проблемы:
В папке находятся файлы
First.mp3
Second.mp3
Third.mp3
Fourth.mp3

Необходимо для каждого файла создать папку с именем как у файла и переместить каждый файл внутрь одноименной папки.
First\First.mp3
Second\Second.mp3
Third\Third.mp3
Fourth\Fourth.mp3

megaloman 12-03-2016 00:55 2615121

Если батник запускать в папке, где находятся файлы, то
Код:

@echo off
FOR /F "usebackq delims=" %%d IN (`Dir "*.mp3" /b /A:-D 2^>nul`) DO (
        md  "%%~nd"
        move /Y "%%d" "%%~nd\"
)

Либо
Код:

@echo off
FOR %%f IN (*.mp3) DO md "%%~nf" & move /Y "%%f" "%%~nf\"

Либо из командной строки, например, файл-менеджера FAR
FOR %f IN (*.mp3) DO md "%~nf" & move /Y "%f" "%~nf\"

Metallor 12-03-2016 01:10 2615124

Спасибо большое. Второй вариант подошел.

athlonix4@twitter 17-03-2022 20:43 2981862

мне нужно тже самое но только у меня файлы имеют имена:
First_2021-10-22.ts
First_2020-01-18.mp4
Third_2016-02-02.flv
Third_2019-04-05.avi
и т.д.
нужно что бы все файлы с именем в начале "First" перенеслись в папку "First", тоесть куча файлов с разными датами в имени слились в одну папку, и расширения у них разные, но в основном видеоформат.

megaloman 17-03-2022 22:26 2981866

Код:

@Echo Off
cls
        Set "BoxIn=Z:\Box_In"

        FOR /F "usebackq delims=" %%f In (`2^>nul Dir /B /A:-D "%BoxIn%\*_20??-??-??.*"`) DO If Exist "%BoxIn%\%%f" (
                        Set "Name=%%~nf"
                        Call Echo %%Name%%|>nul 2>&1 FindStr/I /R /C:"^.*_20[0-9][0-9]-[0-1][0-9]-[0-3][0-9]$"&& (
                                Call Set "Name=%%Name:~0,-11%%"
                                Call 2>nul Md "%BoxIn%\%%Name%%"
                                Call >nul Move /Y "%BoxIn%\%%Name%%_20??-??-??.*" "%BoxIn%\%%Name%%\"
        ))
Pause
Exit /B

То же, чуть проще и быстрее, но менее надёжно
Код:

@Echo Off
cls
        Set "BoxIn=Z:\Box_In"

        FOR /F "usebackq delims=" %%f In (`2^>nul Dir /B /A:-D "%BoxIn%\*_20??-??-??.*"`) DO If Exist "%BoxIn%\%%f" (
                        Set "Name=%%~nf"
                        Call Set "Name=%%Name:~0,-11%%"
                        Call 2>nul Md "%BoxIn%\%%Name%%"
                        Call >nul Move /Y "%BoxIn%\%%Name%%_20??-??-??.*" "%BoxIn%\%%Name%%\"
        )
Pause
Exit /B


athlonix4@twitter 19-03-2022 17:19 2981976

Цитата:

Цитата megaloman
megaloman »

че то не работает, ничего не происходит

athlonix4@twitter 19-03-2022 19:59 2981985

Цитата:

Цитата megaloman
athlonix4@twitter, вы свой путь прописали вместо моего?
Set "BoxIn=Z:\Box_In"
Имя файла указали правильно? »

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

megaloman 19-03-2022 21:02 2981989

athlonix4@twitter, Виноват, Вы должны указать путь папки, где содержатся эти файлы
Вот еще вариант:
Код:

@Echo Off
cls
        Set "BoxIn=Z:\Box_In"

        If Not "%~1"=="" Set "BoxIn=%~1"

        If "%BoxIn:~-1%"=="\" Set "BoxIn=%BoxIn:~0,-1%
        FOR /F "usebackq delims=" %%f In (`2^>nul Dir /B /A:-D "%BoxIn%\*_20??-??-??.*"`) DO If Exist "%BoxIn%\%%f" (
                        Set "Name=%%~nf"
                        Call Set "Name=%%Name:~0,-11%%"
                        Call 2>nul Md "%BoxIn%\%%Name%%"
                        Call >nul Move /Y "%BoxIn%\%%Name%%_20??-??-??.*" "%BoxIn%\%%Name%%\"
        )
Pause
Exit /B

Сохраните где-нибудь батник, на рабочем столе создайте на него иконку и в проводнике затаскивайте на нее обрабатываемую папку.
Можете просто запускать батник, но при этом путь к папке возьмется из батника.
Если поместить батник в обрабатываемую папку и запускать оттуда, то:
Set "BoxIn=%~dp0"

athlonix4@twitter 19-03-2022 21:38 2981993

Цитата:

Цитата megaloman
megaloman »

спасибо огромное, все работает, если можно еще один нюанс, оказалось что есть файлы и с таким форматом имени:
Nikolay_2021-08-26_22-23-36_0001.ts
Nikolay_2022-01-21_21-23-25-proxy.ts
Nikolay_2022-01-21_21-23-25_deleted.ts
как быть с этим? редактировать батник под свой формат, я попытался, но что то пошло не так, или есть универсальный способ?

megaloman 19-03-2022 21:57 2981995

athlonix4@twitter, "Nikolay" - как я понимаю, имя произвольное. Оно может содержать знак "_" ? Кстати, этот вопрос относится и к предыдущим файлам.

megaloman 19-03-2022 22:49 2981997

athlonix4@twitter,
Код:

@Echo Off
cls
        Set "BoxIn=Z:\Box_In"
rem        Set "BoxIn=%~dp0"

        If Not "%~1"=="" Set "BoxIn=%~1"

        If "%BoxIn:~-1%"=="\" Set "BoxIn=%BoxIn:~0,-1%
        FOR /F "usebackq delims=" %%f In (`2^>nul Dir /B /A:-D "%BoxIn%\*_20??-??-??*.*"`) DO If Exist "%BoxIn%\%%f" (
                        Set "NN=%%~nf"
                        Call :MyMove "%%f" "_20%%NN:*_20=%%"
        )
Pause
Exit /B

:MyMove
        Set "Name=%~n1"
        Call Set "Name=%%Name:%~2=%%"
        2>nul Md "%BoxIn%\%Name%"
        >nul Move /Y "%BoxIn%\%Name%_20??-??-??*.*" "%BoxIn%\%Name%\"
Exit /B

Батник будет работать корректно, если внутри имени, например, Nikolay, нет сочетания _20, например Niko_20lay

athlonix4@twitter 20-03-2022 00:59 2982000

Цитата megaloman:
athlonix4@twitter, "Nikolay" - как я понимаю, имя произвольное. Оно может содержать знак "_" ? Кстати, этот вопрос относится и к предыдущим файлам. »
да, "Nikolay" для примера, оно может быть любым, и оно тоже может содержать знак "_", например "_eva_ava_2021-02-07_22-13-27_0002.ts", имя папки должно быть, "_eva_ava", то есть имя папки это все что перед "_20??..." и т.д.

Цитата megaloman:
Батник будет работать корректно, если внутри имени, например, Nikolay, нет сочетания _20, например Niko_20lay »
протестил на небольшом количестве файлов все ок, спасибо. завтра на основной папке попробую.


Время: 15:59.

Время: 15:59.
© OSzone.net 2001-