Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

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

 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
gendalv



Joined: 20 Jul 2013
Posts: 18

Post (Separately) Posted: Sat Jul 20, 2013 09:19    Post subject: Перемещение файлов с учетом размера и без учета расширения Reply with quote

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

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

То есть при перемещении файлов из одной папки в другую, нужно автоматически перемещать с заменой (без учета расширения) файлы с меньшим размером и с соответствующим именем (без учета их расширения) - таким образом в папке из которой перемещали останутся только бОльшие по размеру файлы.
Back to top
View user's profile Send private message
MVV



Joined: 15 Oct 2009
Posts: 4811
Location: Ростов-Дон

Post (Separately) Posted: Mon Jul 22, 2013 15:11    Post subject: Reply with quote

Сохранить как copy_over_name_by_size.cmd и перетащить на панель инструментов, потом в свойствах прописать параметры %WL %T.
Code:
@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

Затем выделить файлы для копирования и нажать кнопку (в неактивной панели должна быть открыта папка назначения). Для каждого копируемого файла в папке назначения ищется файл с таким же именем (без учета расширения), если его размер меньше размера копируемого файла, файл пропускается, иначе - копируется (при этом соответствующий файл в папке назначения будет удаляться).
_________________
TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel…
Back to top
View user's profile Send private message
gendalv



Joined: 20 Jul 2013
Posts: 18

Post (Separately) Posted: Tue Jul 23, 2013 03:35    Post subject: Reply with quote

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

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


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

ps2:
можно сделать чтоб файл в корзину удалялся, а не насовсем?
Back to top
View user's profile Send private message
MVV



Joined: 15 Oct 2009
Posts: 4811
Location: Ростов-Дон

Post (Separately) Posted: Wed Jul 24, 2013 09:48    Post subject: Reply with quote

Quote:
работает только если в пути нет папок в имени которых есть пробелы!

А попробуй параметры %WL "%T". В файле кавычки добавляются, а параметр %T их не добавляет.

Quote:
ps1:

Открываешь поиск Alt+F7, находишь все файлы в подпапках, жмешь кнопку вывода в панель и выделяешь - и батник скопирует их все.

Quote:
ps2:

Сомневаюсь, что это возможно без использования внешних утилит. Возможно, кто-то знает. Единственное что можно - переименовывать файлы, а не удалять их, или переносить в какую-нибудь подпапку.
Code:
: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.
_________________
TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel…
Back to top
View user's profile Send private message
gendalv



Joined: 20 Jul 2013
Posts: 18

Post (Separately) Posted: Thu Jul 25, 2013 12:34    Post subject: Reply with quote

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

Quote:
ps2:
работает


Quote:
Quote:
ps1:

Открываешь поиск Alt+F7, находишь все файлы в подпапках, жмешь кнопку вывода в панель и выделяешь - и батник скопирует их все.
Если вывести на обе панели все файлы из подпапок - то он просто в корень диска копирует (D:\).
Если во второй панели просто целевая папка открыта, а в донорской все файлы из подпапок найдены\веделены - то не работает.
(к тому же папка delete не создается)
Back to top
View user's profile Send private message
MVV



Joined: 15 Oct 2009
Posts: 4811
Location: Ростов-Дон

Post (Separately) Posted: Thu Jul 25, 2013 17:50    Post subject: Reply with quote

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

У меня работает: слева выделил файлы из результатов поиска и нажал кнопку, справа была открыта папка назначения (пустая), файлы скопировались нормально, один файл перенесся в папку delete (т.к. после его копирования был скопирован файл с таким именем, но меньшим размером).
_________________
TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel…
Back to top
View user's profile Send private message
gendalv



Joined: 20 Jul 2013
Posts: 18

Post (Separately) Posted: Thu Jul 25, 2013 21:29    Post subject: Reply with quote

Quote:
справа была открыта папка назначения (пустая)

MVV, всмысле пустая?

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

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

ну и delete создается - только если файлы целевой папки в корне лежат.
Back to top
View user's profile Send private message
MVV



Joined: 15 Oct 2009
Posts: 4811
Location: Ростов-Дон

Post (Separately) Posted: Thu Jul 25, 2013 21:52    Post subject: Reply with quote

gendalv wrote:
MVV, всмысле пустая?

В том смысле, что я специально создал пустую папку, куда собираю файлы.

gendalv wrote:
Структура папок/имена папок одинаковы (пути файлов совпадают)

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

Структура каталогов при копировании не сохраняется (в первом посте об этом речи не было - было сказано про две папки). Все выделенные в активной панели файлы копируются в одну папку - ту, которая открыта в неактивной панели. Единственный подкаталог, который там может быть создан - deleted.
_________________
TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel…
Back to top
View user's profile Send private message
gendalv



Joined: 20 Jul 2013
Posts: 18

Post (Separately) Posted: Fri Jul 26, 2013 05:43    Post subject: Reply with quote

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

MVV, условия основного вопроса уже достигнуты, спасибо Smile

а я говорю о
Quote:
ps1:
можно сделать чтоб в папки/подпапки тоже заглядывал? (выделять папку(и) а не файлы)(пути файлов в обеих папках одинаковы)
Back to top
View user's profile Send private message
MVV



Joined: 15 Oct 2009
Posts: 4811
Location: Ростов-Дон

Post (Separately) Posted: Fri Jul 26, 2013 23:27    Post subject: Reply with quote

Quote:
а я говорю о

Я понял это как сваливание всех файлов из подпапок в одну папку. Возможно и с сохранением структуры, как-нибудь напишу.
_________________
TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel…
Back to top
View user's profile Send private message
gendalv



Joined: 20 Jul 2013
Posts: 18

Post (Separately) Posted: Tue Jan 21, 2014 04:46    Post subject: Reply with quote

файлы в имени которых есть знак " – " пропускаются (не удается найти указанный файл)
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Thu Jan 23, 2014 09:51    Post subject: Reply with quote

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


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

' Условие: путь запуска пустой
' Параметры: %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) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
gendalv



Joined: 20 Jul 2013
Posts: 18

Post (Separately) Posted: Sat Sep 27, 2014 11:41    Post subject: Reply with quote

Flasher, пробелы яаляются частью имени папки, собственно разнообразие имен папок со всякими символами и вызывало проблемы у скрипта выше, приходилось вручную папки переименовывать Razz
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Sat Sep 27, 2014 12:15    Post subject: Reply with quote

gendalv
Угу, "не прошло и года". Wink
Батник "выше" имелся в виду? Я читал.
Так я не понял, мой скрипт с обработкой структуры подошёл?
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group