Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Удаление одинаковых файлов по размеру

Ответить
Настройки темы
CMD/BAT - [решено] Удаление одинаковых файлов по размеру

Пользователь


Сообщения: 64
Благодарности: 1

Профиль | Отправить PM | Цитировать


Изменения
Автор: Arsenik77
Дата: 16-07-2011
Добрый день, нужен батник который сравнивал и удалял одинаковые по размеру файлы в одной папке (и оставлял только один).
Сторонние программы не хочу использовать, нужно именно bat.

Отправлено: 10:41, 16-07-2011

 

Пользователь


Сообщения: 64
Благодарности: 1

Профиль | Отправить PM | Цитировать


root221, Iska, Foreigner, megaloman, - СПАСИБО!
megaloman - работает.

Отправлено: 17:38, 16-07-2011 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Старожил


Сообщения: 352
Благодарности: 119

Профиль | Отправить PM | Цитировать


Удаление дубликатов по хешу

Отправлено: 17:47, 16-07-2011 | #12


Пользователь


Сообщения: 64
Благодарности: 1

Профиль | Отправить PM | Цитировать


megaloman, поторопился немного, bat-к работает, но как-то выборочно. Проверил на 5000 файлов в папке, батник удаляет, но не всЁ.

Примерно разобрался в чем дело, на файлах где есть в арабские (китайские) или другие не типичные символы батник затыкаеться.
типа XXXXXXXXXXXXX_Штукатурка.jpg
Нужно чтоб батник переименовывал их, во что нибудь типа XXXXXXXXXXXXX_yyyyy.jpg, где XXXXXXXXXXXXX - важные символы, yyyyy неважно.

Батник будет проверять по 100-200 тыс.файлов.

Последний раз редактировалось Arsenik77, 16-07-2011 в 20:10.


Отправлено: 18:15, 16-07-2011 | #13


Ветеран


Contributor


Сообщения: 24055
Благодарности: 6985

Профиль | Отправить PM | Цитировать


Цитата Arsenik77:
Iska, скрипт полностью удаляет все файлы в папке. »
Arsenik77, какой скрипт из двух? У меня работают оба варианта.

Если Вам нужно искать и удалять дубликаты — то это совсем другой разговор, например, «CloneSpy» или «Duplicate Files Finder», або что-то своё — в зависимости от конкретной задачи и условий применения.

Отправлено: 20:26, 16-07-2011 | #14


Пользователь


Сообщения: 64
Благодарности: 1

Профиль | Отправить PM | Цитировать


Iska, работает VBScript, PowerShell не понял как запускать.
Но только надо по одному файлу из тех, у которых размер одинаков, оставить.

Скрипт также работает с "трудными" именами файлов.

Последний раз редактировалось Arsenik77, 16-07-2011 в 20:40.


Отправлено: 20:30, 16-07-2011 | #15


Ветеран


Contributor


Сообщения: 1526
Благодарности: 897

Профиль | Отправить PM | Цитировать


Попробуйте вариант решения, но при таком большом числе файлов не уверен, как сработает сортировка в Dir. Я попробовал на 50000 файлов, но они небольшого размера
Код: Выделить весь код
@Echo Off

Set Otkuda=E:\dddddddd
Set S1=-1

FOR /F "usebackq delims=" %%f IN (`Dir /B /A:-D /O:S "%Otkuda%\"`) DO Call :DelSize "%Otkuda%\%%f" 
GoTo :Eof

:DelSize
Set S2=%~z1

If %S1% NEQ %S2% (
   Set S1=%S2%
) Else (
   Del %1
)

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 16-07-2011 в 21:06.


Отправлено: 20:56, 16-07-2011 | #16


Пользователь


Сообщения: 64
Благодарности: 1

Профиль | Отправить PM | Цитировать


megaloman, работает с нормальным именами файлов, затык идет на таких именах у файло⠨тукатурка.jpg

Отправлено: 21:29, 16-07-2011 | #17


Ветеран


Contributor


Сообщения: 1518
Благодарности: 849

Профиль | Отправить PM | Цитировать


Arsenik77,
Попробуй такой вариант, правда на большом кол-ве файлов не проверял:
Код: Выделить весь код
@echo off
setlocal

pushd "c:\test\folder" || goto:eof
for /f "tokens=*" %%i in ('dir /b /a-d') do call:del "%%~fi"
popd
goto:eof

:del
set "file=%~1"

2>nul 1>nul (

wmic datafile where "path='\\test\\folder\\' and filesize='%~z1' and not name='%file:\=\\%'" call delete

)

Отправлено: 21:52, 16-07-2011 | #18


Пользователь


Сообщения: 64
Благодарности: 1

Профиль | Отправить PM | Цитировать


Батник затыкается на не правильных именах файлов, типа :
читать дальше »
16_21217_26+PE%C3%87AS+PRONTAS.JPG.jpg
12809_Гостиная_3.jpg.jpg
12810_Штукатурка_1.jpg.jpg
12811_Штукатурка_2.jpg.jpg

Либо эти файлы (с кривыми именами) надо удалять, либо как-то переименовывать.

Задачу считаю решенной, спасибо megaloman

Последний раз редактировалось Arsenik77, 18-07-2011 в 10:43.


Отправлено: 22:09, 16-07-2011 | #19


Ветеран


Contributor


Сообщения: 24055
Благодарности: 6985

Профиль | Отправить PM | Цитировать


В принципе, у меня сработали и пакетный файл Foreigner'а, и пакетный файл megaloman'а.

Цитата Arsenik77:
Но только надо по одному файлу из тех, у которых размер одинаков, оставить. »
Ясно. Поскольку изначально в условиях задачи было сказано, что:
Цитата Arsenik77:
удалял одинаковые по размеру файлы в одной папке »
то, я хоть и удивился, но сделал именно так, как было сказано . Причём, коллега megaloman оказался проницательнее — не только удивился, но и усомнился (и, как выяснилось, оказался прав).


Тогда ещё проще (хоть уже и нет необходимости, но приведу код):
Код: Выделить весь код
Option Explicit

Dim objFSO
Dim strFolder
Dim objFile
Dim objDictionary
Dim elem


If WScript.Arguments.Count = 1 Then
	Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
	
	strFolder = WScript.Arguments.Item(0)
	
	If objFSO.FolderExists(strFolder) Then
		Set objDictionary = WScript.CreateObject("Scripting.Dictionary")
		
		For Each objFile In objFSO.GetFolder(strFolder).Files
			If objDictionary.Exists(objFile.Size) Then
				objFSO.DeleteFile objFile.Path, True
			Else
				objDictionary.Add objFile.Size, objFile.Path
			End If
		Next
		
		objDictionary.RemoveAll
		
		Set objDictionary = Nothing
	Else
		WScript.Echo "Folder [" & strFolder & "] not found."
	End If
	
	Set objFSO = Nothing
Else
	WScript.Echo "Usage: " & WScript.ScriptName & " <folder>"
End If

WScript.Quit 0
и примерно так (уверен, что подобрал не самый оптимальный вариант):
Код: Выделить весь код
param (
    [string]$Folder = "E:\Песочница\0061\*"
)
Get-ChildItem -Path $Folder | `
    Where-Object -FilterScript { -not $_.PSIsContainer } | `
        Group-Object -Property Length | `
            Where-Object -FilterScript { $_.Count -gt 1 } | `
                ForEach-Object -Process {
                    $_.Group | Select-Object -Skip 1 | Remove-Item -Force
                }
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:18, 18-07-2011 | #20



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Удаление одинаковых файлов по размеру

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] Удаление одинаковых файлов Tonny_Bennet Программирование в *nix 3 14-12-2010 16:44
CMD/BAT - Удаление старых файлов по имени файлов Bиктор Скриптовые языки администрирования Windows 1 19-04-2010 03:37
CMD/BAT - [решено] Удаление одинаковых подпапок из родительской папки D_Master Скриптовые языки администрирования Windows 2 28-03-2009 15:08
удаление одинаковых папок в под папках clop1000 Хочу все знать 5 17-11-2007 00:51
Поиск одинаковых файлов Geo55 Программное обеспечение Windows 6 23-10-2004 10:01




 
Переход