| View previous topic :: View next topic   | 
	
	
	
		| Author | 
		Message | 
	
	
		gendalv
 
 
  Joined: 20 Jul 2013 Posts: 19
 
  | 
		
			
				  (Separately) Posted: Sat Jul 20, 2013 09:19    Post subject: Перемещение файлов с учетом размера и без учета расширения | 
				     | 
			 
			
				
  | 
			 
			
				Есть 2 папки (7000+файлов): имена файлов в папках одинаковы, расширения разные.
 
Нужно получить одну папку наименьшего размера, без изменения расширения\имени файлов.
 
 
ps: Если просто перемещать (F6 + 'Настройки перезаписи'->'Копировать все файлы меньшего размера') из одной папки в другую, то получится, что перезаписаны будут только файлы с совпавшим расширением, а остальные просто переместятся = много дублей с разными расширениями и размерами.
 
 
То есть при перемещении файлов из одной папки в другую, нужно автоматически перемещать с заменой (без учета расширения) файлы с меньшим размером и с соответствующим именем (без учета их расширения) - таким образом в папке из которой перемещали останутся только бОльшие по размеру файлы. | 
			 
		  | 
	
	
		| Back to top | 
		 | 
	
	
		  | 
	
	
		MVV
 
  
  Joined: 15 Oct 2009 Posts: 4815 Location: Ростов-Дон
  | 
		
			
				  (Separately) Posted: Mon Jul 22, 2013 15:11    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				Сохранить как 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 | 
		 | 
	
	
		  | 
	
	
		gendalv
 
 
  Joined: 20 Jul 2013 Posts: 19
 
  | 
		 | 
	
	
		| Back to top | 
		 | 
	
	
		  | 
	
	
		MVV
 
  
  Joined: 15 Oct 2009 Posts: 4815 Location: Ростов-Дон
  | 
		
			
				  (Separately) Posted: Wed Jul 24, 2013 09:48    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | Quote: | 	 		  | работает только если в пути нет папок в имени которых есть пробелы! | 	  
 
А попробуй параметры %WL "%T". В файле кавычки добавляются, а параметр %T их не добавляет.
 
 
 
Открываешь поиск Alt+F7, находишь все файлы в подпапках, жмешь кнопку вывода в панель и выделяешь - и батник скопирует их все.
 
 
 
Сомневаюсь, что это возможно без использования внешних утилит. Возможно, кто-то знает. Единственное что можно - переименовывать файлы, а не удалять их, или переносить в какую-нибудь подпапку.
 
 	  | 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 | 
		 | 
	
	
		  | 
	
	
		gendalv
 
 
  Joined: 20 Jul 2013 Posts: 19
 
  | 
		
			
				  (Separately) Posted: Thu Jul 25, 2013 12:34    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				работает
 
 
работает
 
 
 
 	  | Quote: | 	 		  
 
Открываешь поиск Alt+F7, находишь все файлы в подпапках, жмешь кнопку вывода в панель и выделяешь - и батник скопирует их все.  | 	  Если вывести на обе панели все файлы из подпапок - то он просто в корень диска копирует (D:\). 
 
Если во второй панели просто целевая папка открыта, а в донорской все файлы из подпапок найдены\веделены - то не работает.
 
(к тому же папка delete не создается) | 
			 
		  | 
	
	
		| Back to top | 
		 | 
	
	
		  | 
	
	
		MVV
 
  
  Joined: 15 Oct 2009 Posts: 4815 Location: Ростов-Дон
  | 
		
			
				  (Separately) Posted: Thu Jul 25, 2013 17:50    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				Папка delete создаваться будет только в целевой папке, и только при замене существующего в ней файла новым (с таким же именем и меньшим размером).
 
 
У меня работает: слева выделил файлы из результатов поиска и нажал кнопку, справа была открыта папка назначения (пустая), файлы скопировались нормально, один файл перенесся в папку delete (т.к. после его копирования был скопирован файл с таким именем, но меньшим размером). _________________ TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
 
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel… | 
			 
		  | 
	
	
		| Back to top | 
		 | 
	
	
		  | 
	
	
		gendalv
 
 
  Joined: 20 Jul 2013 Posts: 19
 
  | 
		
			
				  (Separately) Posted: Thu Jul 25, 2013 21:29    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | Quote: | 	 		  | справа была открыта папка назначения (пустая) | 	  
 
MVV, всмысле пустая?
 
 
Структура папок/имена папок одинаковы (пути файлов совпадают)
 
т.е. нужно сравнивать/перемещать из: d:\папка 1\подпапка a\подпапка b\файл в d:\папка 2\подпапка a\подпапка b\файл
 
 
Если поиском выбрать все файлы, то они потом просто переместятся в корень целевой папки а не будет заглядывать и заменять в подпапках.
 
 
ну и delete создается - только если файлы целевой папки в корне лежат. | 
			 
		  | 
	
	
		| Back to top | 
		 | 
	
	
		  | 
	
	
		MVV
 
  
  Joined: 15 Oct 2009 Posts: 4815 Location: Ростов-Дон
  | 
		
			
				  (Separately) Posted: Thu Jul 25, 2013 21:52    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | 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 | 
		 | 
	
	
		  | 
	
	
		gendalv
 
 
  Joined: 20 Jul 2013 Posts: 19
 
  | 
		
			
				  (Separately) Posted: Fri Jul 26, 2013 05:43    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | Quote: | 	 		  | Структура каталогов при копировании не сохраняется (в первом посте об этом речи не было - было сказано про две папки) | 	  
 
MVV, условия основного вопроса уже достигнуты, спасибо    
 
 
а я говорю о
 
 	  | Quote: | 	 		  ps1: 
 
можно сделать чтоб в папки/подпапки тоже заглядывал? (выделять папку(и) а не файлы)(пути файлов в обеих папках одинаковы) | 	 
  | 
			 
		  | 
	
	
		| Back to top | 
		 | 
	
	
		  | 
	
	
		MVV
 
  
  Joined: 15 Oct 2009 Posts: 4815 Location: Ростов-Дон
  | 
		 | 
	
	
		| Back to top | 
		 | 
	
	
		  | 
	
	
		gendalv
 
 
  Joined: 20 Jul 2013 Posts: 19
 
  | 
		
			
				  (Separately) Posted: Tue Jan 21, 2014 04:46    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				| файлы в имени которых есть знак " – " пропускаются (не удается найти указанный файл) | 
			 
		  | 
	
	
		| Back to top | 
		 | 
	
	
		  | 
	
	
		Flasher
 
  
  Joined: 06 Nov 2009 Posts: 14229 Location: Москва
  | 
		
			
				  (Separately) Posted: Thu Jan 23, 2014 09:51    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | 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 | 
		 | 
	
	
		  | 
	
	
		gendalv
 
 
  Joined: 20 Jul 2013 Posts: 19
 
  | 
		
			
				  (Separately) Posted: Sat Sep 27, 2014 11:41    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				Flasher, пробелы яаляются частью имени папки, собственно разнообразие имен папок со всякими символами и вызывало проблемы у скрипта выше, приходилось вручную папки переименовывать   | 
			 
		  | 
	
	
		| Back to top | 
		 | 
	
	
		  | 
	
	
		Flasher
 
  
  Joined: 06 Nov 2009 Posts: 14229 Location: Москва
  | 
		
			
				  (Separately) Posted: Sat Sep 27, 2014 12:15    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				gendalv
 
Угу, "не прошло и года".  
 
Батник "выше" имелся в виду? Я читал.
 
Так я не понял, мой скрипт с обработкой структуры подошёл? _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. | 
			 
		  | 
	
	
		| Back to top | 
		 | 
	
	
		  | 
	
	
		 |