Страница 1 из 3
Перемещение файлов в папки по первым буквам их имён
Добавлено: Пт май 04, 2012 19:19
shveicar
Возникла такая проблема:
В одной панели файлы jpg с именами разной длинны
Код: Выделить всё
12_1.jpg
12_2.jpg
aib3.jpg
alenk4.jpg
alenk5.jpg
В другой каталоги с именами
Код: Выделить всё
12_mesjatsev
aibolit
alenk_tsvetochek1
alenushka_ivanushka
Как можно переместить файлы в эти каталоги (противоположная панель total commander) Файлы 12_1.jpg, 12_2.jpg и alenk4.jpg, alenk5.jpg должны попасть в одну свою папку соответственно (12_mesjatsev) и (alenk_tsvetochek1)
По логике, если перемещение, заданно по первым трем буквам имени файла то должны переместиться файлы
а файлы alenk4.jpg, alenk5.jpg остаться на своем месте, из за совпадения в именах каталогов (alenk_tsvetochek1 и
alenushka_ivanushka) Если после этого будет возможность изменить ориентировку на пять букв, то должны переместиться и оставшиеся 3 файла (alenk4.jpg, alenk5.jpg)
Это был бы идеальный вариант.
Спасибо.
Добавлено: Пт май 04, 2012 23:30
Flasher
Мутно.. Что должно быть критерием - символ-разделитель (знак подчёркивания) или указание числа первых совпадающих символов?
shveicar писал(а):Как можно ...
Не только в отношении конкретного топика: после вопроса должен идти соотв. знак "?".
Добавлено: Сб май 05, 2012 00:30
shveicar
Flasher
Здравствуйте.
Пытался отобразить проблему подробно, но видно не получилось...
Что должно быть критерием
В именах присутствуют как цифры, так и буквы, следовательно - Ориентир при переносе - указание числа первых совпадающих символов, длинна которых может меняться (например в параметрах), для более точной сортировки.
Если в скрипте задан ориентир по трем (например) символам, и существуют каталоги с одинаковыми (тремя) начальными символами, то файлы, имеющие в имени те-же самые три одинаковых символа, - остаются на месте, до следующего изменения числа символов в параметрах скрипта.
Все остальные значения в именах файлов, (выходящие за заданный диапазон в параметрах) при переносе - игнорируются. То есть, имена с окончаниями ....1.jpg ...._2.jpg переносятся в один каталог, при условии что он существует и начальные имена файлов и каталогов совпадают.
Спасибо.
Добавлено: Сб май 05, 2012 01:08
Tol!k
Добавлено: Сб май 05, 2012 01:21
shveicar
Tol!k
Гм. А это что?
Да, его Я пробовал в первую очередь, но к сожалению в Моем случае он не подходит. Скрипт работает, если имена файлов и каталогов имеют одинаковые имена.
Да у Batya есть масса замечательных скриптов, - только, с похожими вариантами. Я несколько дней просматривал форум в поисках подходящих для этой задачи "инструментов", но конкретного решения,- так и не нашел. Хотя, не жалею о потраченном времени, поскольку обнаружил много полезного.
Добавлено: Сб май 05, 2012 23:12
Flasher
shveicar писал(а):и существуют каталоги с одинаковыми (тремя) начальными символами, то файлы, имеющие в имени те-же самые три одинаковых символа, - остаются на месте
shveicar писал(а):Все остальные значения в именах файлов, (выходящие за заданный диапазон в параметрах) при переносе - игнорируются.

И как это понимать? И одно остаётся, и другое игнорируется..
Добавлено: Сб май 05, 2012 23:51
shveicar
Flasher
Добрый ночи.
И как это понимать? И одно остаётся, и другое игнорируется
Попробую рассмотреть в таком примере:
В параметрах переноса указан ориентир, (например) 3 символа, 2 разных каталога имеют имена abcd...(a-z) и abc2..(a-z) в них переносятся файлы имеющие имена abcd...(a-z) и и abc2..(a-z) - куда они должны переместиться? - естественно, - никуда, поскольку есть совпадения в пути назначения по первым 3 символам (совпадение подразумевает, одинаковые имена у двух и боле каталогов, в данном случае в первых трех символах).
Далее, попытка переноса номер 2, -параметр числа символов изменен на 4: - те же каталоги, каталог abcd..(a-z) и abc2..(a-z) в них переносятся те же файлы abcd...(a-z) и и abc2..(a-z) - теперь они попадут, каждый в свой каталог, поскольку совпадений нет.
Добавлено: Вс май 06, 2012 00:49
Tol!k
Код: Выделить всё
@echo off &chcp 1251 >nul
setlocal enableextensions enabledelayedexpansion
:: http://forum.wincmd.ru/viewpost.php?p=92136
:: Пример параметров: "%L" "%T"
for /f "usebackq delims=" %%f in ("%~1") do (
set "Name=%%~nf" &title "%%~nxf"
for /l %%n in (3,1,123) do if exist "%%f" (
set "Same=!Name:~0,%%n!" &set /a dirs=0
for /f "delims=[]" %%d in ('dir /b/ad "%~2\!Same!*" 2^>nul ^|find /n /v ""') do set /a dirs=%%d
if "!dirs!"=="1" for /f "delims=" %%a in ('dir /b/ad "%~2\!Same!*"') do move /y "%%f" "%~2\%%a\"
)
)
goto :eof
проблемы с !
Добавлено: Вс май 06, 2012 01:22
shveicar
Tol!k
Большое Спасибо, На мелких файлах работает, но что означает проблемы с ! (имеется ввиду символ! в имени?) и в каком месте батника находятся изменяемые параметры - ориентир по числу символов при переносе 3, 4 или 5? Если можно - вынести их в параметры кнопки, будет великолепно.
Сейчас проверю на больших файлах,
Еще раз премного благодарен.
Добавлено: Вс май 06, 2012 01:37
Tol!k
что означает
в именах файлов/папок
изменяемые параметры
(3,1,123) = от 3 до 123
Добавлено: Вс май 06, 2012 02:35
shveicar
(3,1,123) = от 3 до 123
Извиняюсь за "неграмотность"
То есть значение 1, - меняется не должно?
Добавлено: Вс май 06, 2012 02:47
Tol!k
нет. это шаг
Добавлено: Вс май 06, 2012 21:23
Flasher
Код: Выделить всё
'•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
' Перемещение выделенных файлов в папки с тем же началом в имени,
' если под этот критерий подходит только одна папка в получателе
' Параметры:
' 1) %WL
' 2) "<путь назначения>"
' 3) <число первых совпавших символов> (при отсутствии вводим в окне)
' 4) <максимальное число символов> (0 - отключить; при отсутствии - в окне)
' Примеры:
' 1) %WL C:\Тест
' 2) %WL "%T" 3 0
' 3) %WL "%T" "" 6
' 4) %WL "%T" 5 20
' Автор - Flasher ©
'•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
With WScript.Arguments
C = .Count : If C = 0 Then WScript.Quit
On Error Resume Next
List = .Item(0) : Path = .Item(1)
If C < 3 Then
Num = "" : Chek Num, ""
Else
Num = .Item(2) : If Len(.Item(2)) = 0 Then Chek Num, ""
End If
If C < 4 Then
Max = "" : Chek Max, "МАКСИМАЛЬНОЕ "
Else
Max = .Item(3) : If Max = 0 Then Max = Num
End If
On Error Goto 0
If C < 2 Then : MsgBox "Укажите не менее 2-ух параметров!", 4144, _
"Рассортировка файлов по папкам" : WScript.Quit : End if
End With : If Right(Path, 1) <> "\" Then Path = Path & "\"
Sub Chek(Count, Word)
L = vbNewline
Do Until IsNumeric(Count)
Count = InputBox(L&L&L&L&L& "Введите " & Word & "число первых" & _
" символов в именах:", "Рассортировка файлов по папкам", 3)
If Trim(Count) = "" Then WScript.Quit
Loop
End Sub
Set FSO = CreateObject("Scripting.FileSystemObject")
Set SbF = FSO.GetFolder(Path).SubFolders
Set NSp = CreateObject("Shell.Application").NameSpace(Path)
For Each F in Split(FSO.GetFile(List).OpenAsTextStream(1, -1).ReadAll, vbNewline)
If F > vbNullString Then
If FSO.FileExists(F) Then
For i = Num to Max
Start = Left(FSO.GetBaseName(F), i) : Set Items = NSP.Items
Items.Filter 32, Start & "*"
If Items.Count = 1 Then
For Each FF in SbF
If StrComp(Start, Left(FSO.GetFileName(FF), i), 1) = 0 Then
FSO.MoveFile F, FF & "\" : Exit For
End If
Next
End If : Set Items = Nothing
Next
End If
End If
Next : Set FSO = Nothing : Set NSP = Nothing : Set SbF = Nothing : WScript.Quit
Добавлено: Вс май 06, 2012 23:30
shveicar
Flasher
Отличный скрипт, если сравнивать по скорости, - раз в 5 работает быстрее чем батник, не говоря уже о возможности удобства изменения параметров, Впрочем, каждый пусть сам решает, каким "инструментом" пользоваться.
Большое Всем Спасибо.
Добавлено: Вс май 06, 2012 23:52
Tol!k
а в чём профит изменения параметров?