Войти

Показать полную графическую версию : Создание папок по части имён файлов и перемещение в них этих файлов


Floatzel
22-07-2025, 19:58
Прошу помочь с написанием скрипта.

Имеется: папка с множеством файлов содержащих одинаковую часть в названии.
Например:
image-01.jpg
image-02.jpg
image-03.jpg
image 2-01.jpg
image 2-01.png
image 2-10.jpg
other_ picture 17-01.jpg
other_ picture 17-02.jpg
other_ picture 17-01.png
other_ picture 17-02.png
other_ picture 17-17.png
wallpapers-picture-01.jpg
wallpapers-picture-02.jpg
wallpapers-picture-03.jpg
wallpapers-picture-09.jpg
wallpapers-picture-23.jpg

Нужно: создать папки по начальной части имени файла до последних трех символов (формата "-01" "-02" "-17" и т.д.) и переместить в них файлы содержащие эту часть.
т.е. должны создастся папки:
image
image 2
other_ picture 17
wallpapers-picture

нужно чтобы скрипт работал и в корневой папке и подпапках.

расширение файлов: .jpg, .png, .jpeg

DJ Mogarych
22-07-2025, 20:40
Powershell v5

$folder = "C:\temp\pictures"

cd $folder
dir -Recurse -File -Include "*.jpg","*.png","*.jpeg" |group {$_.basename -replace '.{3}$'} |% {
mkdir $_.Name -ErrorAction SilentlyContinue > $null
if (Test-Path $_.Name) {
$_.group |mv -Destination $_.Name
}
}

Sham
22-07-2025, 22:46
нужно чтобы скрипт работал и в корневой папке и подпапках. »
Как рекурсии с папками избежать. Папки создаёшь, и потом туда же лезешь и внутри получается опять создаёшь. Надо чтобы не лезть туда - или префикс какой-нибудь в имени папки, или переименование файлов при перемещении.

DJ Mogarych
22-07-2025, 23:09
Скрипт выше создаёт папки на верхнем уровне, а файлы вытаскивает из всех папок рекурсивно.

megaloman
24-07-2025, 21:50
Floatzel, cmd @Echo Off &Cls
Set "BoxIn=Z:\Soft_In"
Pushd "%BoxIn%"||(Echo Folder "%BoxIn%" not found &Pause &Exit /B 2)

For /f "usebackq delims=" %%f IN (`2^>nul Dir /b /s /A:-D "%BoxIn%\*-??.*" ^|FindStr /R /C:"-..\..*$"`) Do (
Set "DirName=%%~nf"
Call Set "DirName=%%DirName:~0,-3%%"
2>nul Call MD "%%DirName%%"
>nul Call Move /Y "%%f" "%%DirName%%\"
)
For /F "usebackq delims=" %%d In (`2^>nul Dir /b /s /A:D "%BoxIn%\" /S /B /A:D ^|Sort /R`) Do 2>nul RD "%%d"
Pause
Exit /B 2
Путь к исходной папке укажите свой вместо Z:\Soft_In
После перемещения файлов пустые папки удаляются (последний For)




© OSzone.net 2001-2012