Перемещение файлов с учетом размера и без учета расширения

Обсуждение вопросов автоматизации Total Commander с помощью сторонних программ и скриптовых технологий.

Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер

Ответить
gendalv
Сообщения: 22
Зарегистрирован: Сб июл 20, 2013 08:36

Перемещение файлов с учетом размера и без учета расширения

Сообщение gendalv »

Есть 2 папки (7000+файлов): имена файлов в папках одинаковы, расширения разные.
Нужно получить одну папку наименьшего размера, без изменения расширения\имени файлов.

ps: Если просто перемещать (F6 + 'Настройки перезаписи'->'Копировать все файлы меньшего размера') из одной папки в другую, то получится, что перезаписаны будут только файлы с совпавшим расширением, а остальные просто переместятся = много дублей с разными расширениями и размерами.

То есть при перемещении файлов из одной папки в другую, нужно автоматически перемещать с заменой (без учета расширения) файлы с меньшим размером и с соответствующим именем (без учета их расширения) - таким образом в папке из которой перемещали останутся только бОльшие по размеру файлы.
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

Сохранить как copy_over_name_by_size.cmd и перетащить на панель инструментов, потом в свойствах прописать параметры %WL %T.

Код: Выделить всё

@echo off
title copy_over_name_by_size
if -%1==- echo Parameters: %%WL %%T & pause & goto :EOF
set tmpsetfile="%temp%\~$tmpsetfile$~.tmp"
for /f "usebackq delims=" %%f in (`type %1`) do call :copy_find_same "%%f" %2
del %tmpsetfile%
pause
goto :EOF

:copy_find_same
dir /b "%~2\%~n1.*" 1>%tmpsetfile% 2>nul
if errorlevel 1 call :copy_do %1 "%~2\%~nx1" & goto :EOF
set /p samenametarget=<%tmpsetfile%
call :copy_check_size %1 "%~2\%~nx1" "%~2\%samenametarget%"
goto :EOF

:copy_check_size
if %~z3 LEQ %~z1 goto :EOF
attrib -r %3
del %3

:copy_do
echo %~nx1
copy %1 %2
goto :EOF
Затем выделить файлы для копирования и нажать кнопку (в неактивной панели должна быть открыта папка назначения). Для каждого копируемого файла в папке назначения ищется файл с таким же именем (без учета расширения), если его размер меньше размера копируемого файла, файл пропускается, иначе - копируется (при этом соответствующий файл в папке назначения будет удаляться).
gendalv
Сообщения: 22
Зарегистрирован: Сб июл 20, 2013 08:36

Сообщение gendalv »

MVV писал(а):перетащить на панель инструментов
имеется ввиду: ПКМ-Изменить... и вот так:
http://s001.radikal.ru/i196/1307/56/ccff9a6cbdd4.png

в общем случае не работает:
http://019.radikal.ru/i604/1307/1e/286c458355da.jpg
работает только если в пути нет папок в имени которых есть пробелы!


ps1:
можно сделать чтоб в папки/подпапки тоже заглядывал? (выделять папку(и) а не файлы)(пути файлов в обеих папках одинаковы)

ps2:
можно сделать чтоб файл в корзину удалялся, а не насовсем?
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

работает только если в пути нет папок в имени которых есть пробелы!
А попробуй параметры %WL "%T". В файле кавычки добавляются, а параметр %T их не добавляет.
ps1:
Открываешь поиск Alt+F7, находишь все файлы в подпапках, жмешь кнопку вывода в панель и выделяешь - и батник скопирует их все.
ps2:
Сомневаюсь, что это возможно без использования внешних утилит. Возможно, кто-то знает. Единственное что можно - переименовывать файлы, а не удалять их, или переносить в какую-нибудь подпапку.

Код: Выделить всё

:copy_check_size
if %~z3 LEQ %~z1 goto :EOF
attrib -r %3
md "%~dp3\deleted" 2>nul
echo - %~nx3
move %3 "%~dp3\deleted"
При таком изменении блока :copy_check_size батника файлы будут не удаляться, а переноситься в подпапку deleted.
gendalv
Сообщения: 22
Зарегистрирован: Сб июл 20, 2013 08:36

Сообщение gendalv »

%WL "%T"
работает
ps2:
работает

ps1:
Открываешь поиск Alt+F7, находишь все файлы в подпапках, жмешь кнопку вывода в панель и выделяешь - и батник скопирует их все.
Если вывести на обе панели все файлы из подпапок - то он просто в корень диска копирует (D:\).
Если во второй панели просто целевая папка открыта, а в донорской все файлы из подпапок найдены\веделены - то не работает.
(к тому же папка delete не создается)
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

Папка delete создаваться будет только в целевой папке, и только при замене существующего в ней файла новым (с таким же именем и меньшим размером).

У меня работает: слева выделил файлы из результатов поиска и нажал кнопку, справа была открыта папка назначения (пустая), файлы скопировались нормально, один файл перенесся в папку delete (т.к. после его копирования был скопирован файл с таким именем, но меньшим размером).
gendalv
Сообщения: 22
Зарегистрирован: Сб июл 20, 2013 08:36

Сообщение gendalv »

справа была открыта папка назначения (пустая)
MVV, всмысле пустая?

Структура папок/имена папок одинаковы (пути файлов совпадают)
т.е. нужно сравнивать/перемещать из: d:\папка 1\подпапка a\подпапка b\файл в d:\папка 2\подпапка a\подпапка b\файл

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

ну и delete создается - только если файлы целевой папки в корне лежат.
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

gendalv писал(а):MVV, всмысле пустая?
В том смысле, что я специально создал пустую папку, куда собираю файлы.
gendalv писал(а):Структура папок/имена папок одинаковы (пути файлов совпадают)

т.е. нужно сравнивать/перемещать из: d:\папка 1\подпапка a\подпапка b\файл в d:\папка 2\подпапка a\подпапка b\файл
Структура каталогов при копировании не сохраняется (в первом посте об этом речи не было - было сказано про две папки). Все выделенные в активной панели файлы копируются в одну папку - ту, которая открыта в неактивной панели. Единственный подкаталог, который там может быть создан - deleted.
gendalv
Сообщения: 22
Зарегистрирован: Сб июл 20, 2013 08:36

Сообщение gendalv »

Структура каталогов при копировании не сохраняется (в первом посте об этом речи не было - было сказано про две папки)
MVV, условия основного вопроса уже достигнуты, спасибо :)

а я говорю о
ps1:
можно сделать чтоб в папки/подпапки тоже заглядывал? (выделять папку(и) а не файлы)(пути файлов в обеих папках одинаковы)
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

а я говорю о
Я понял это как сваливание всех файлов из подпапок в одну папку. Возможно и с сохранением структуры, как-нибудь напишу.
gendalv
Сообщения: 22
Зарегистрирован: Сб июл 20, 2013 08:36

Сообщение gendalv »

файлы в имени которых есть знак " – " пропускаются (не удается найти указанный файл)
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

gendalv писал(а):Структура папок/имена папок одинаковы (пути файлов совпадают)
т.е. нужно сравнивать/перемещать из: d:\папка 1\подпапка a\подпапка b\файл в d:\папка 2\подпапка a\подпапка b\файл
По логике должны совпасть только относительные пути, но никак не абсолютные. Чем в данном случае являются пробелы?
И запись разве не так должна выглядеть?:
d:\папка 1\подпапка\a\подпапка\b\файл в d:\папка 2\подпапка\a\подпапка\b\файл
В общем, если я правильно понял задачу, то vbs:

Код: Выделить всё

'=============================================================================
' Замена в получателе на меньшие по размеру выбранные файлы
' или файлы из аналогичной структуры выбранных каталогов без учёта расширения
' с перемещением бОльших файлов из получателя в корзину

' Условие: путь запуска пустой
' Параметры: %WL "<Путь получателя>"
'=============================================================================
With WScript.Arguments
  If .Count = 0 Then WScript.Quit
  List = .Item(0) : Target = .Item(1)
End With : If Right(Target, 1) <> "" Then Target = Target & ""

Set SHA = CreateObject("Shell.Application")
Set FSO = CreateObject("Scripting.FileSystemObject")
LDir = Len(CreateObject("WScript.Shell").CurrentDirectory) + 2
Set Basket = SHA.Namespace(&Ha&) : Set Items = SHA.NameSpace(Target).Items

For Each F in Split(FSO.GetFile(List).OpenAsTextStream(1,-1).ReadAll, vbNewLine)
  If Trim(F) > vbNullString Then
    If FSO.FolderExists(F) Then ForFolder FSO.GetFolder(F) Else ForFile F, Items, Target
  End If
Next : Set Items = Nothing : Set Basket = Nothing : Set FSO = Nothing : Set SHA = Nothing

Sub ForFolder(Folder)
  For Each Fl In Folder.SubFolders : ForFolder Fl : Next
  TF = Target & Mid(Folder, LDir) & ""
  If FSO.FolderExists(TF) Then
    Set Itms = SHA.NameSpace(TF).Items
    For Each Fl In Folder.Files : ForFile Fl, Itms, TF : Next
  End If
End Sub

Sub ForFile(File, Elems, T)
  Elems.Filter 192, FSO.GetBaseName(File) & ".*"
  If Elems.Count = 1 Then
    Set I = Elems.Item(0)
    If FSO.GetFile(File).Size < I.Size Then
      Basket.MoveHere I, 24 : FSO.MoveFile File, T
    End If
  End If
End Sub
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
gendalv
Сообщения: 22
Зарегистрирован: Сб июл 20, 2013 08:36

Сообщение gendalv »

Flasher, пробелы яаляются частью имени папки, собственно разнообразие имен папок со всякими символами и вызывало проблемы у скрипта выше, приходилось вручную папки переименовывать :P
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

gendalv
Угу, "не прошло и года". :wink:
Батник "выше" имелся в виду? Я читал.
Так я не понял, мой скрипт с обработкой структуры подошёл?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Ответить