Войти

Показать полную графическую версию : [решено] Сравнение файлов по части имени


sampir
15-11-2012, 16:30
Помогите пожалуйста осилить задачу:
Существуют файлы вида:
Call1_9_86686567_1_31.nmf
Call1_10_86686567_1_31.nmf
Call1_11_86686567_1_31.nmf
В общем говоря если часть имени одинакова после второго символа "_", то убить все кроме одного.

Так как сначала предполагалось, что у них у всех одинаковый размер, и их можно уничтожать по этому признаку, то был составлен скрипт (ниже), который лазил по подпапкам и это добросовестно делал.
Но потом оказалось что размер может чуть отличаться, и единственный способ - обрабатывать их по имени. Только вот работать со буквами оказалось совсем тяжко. :(
Помогите пожалуйста доработать.

@(
for /f "tokens=*" %%i in ('dir /b /s /ad') do (
pushd "%%i"
for /f "delims=" %%f in ('dir/b/a-d/os') do @(
if defined $fz (set/a "$fc=$fz-%%~zf"
call set "$fc=%%$fc:0=%%"
if not defined $fc del "%%f")
set "$fz=%%~zf")))

kiripanda
16-11-2012, 21:46
@echo off &setlocal enableextensions

for /f "delims=" %%i in ('dir /b/s/ad') do (
pushd "%%i"
call :list
popd
)
goto :eof

:list
if exist list.tmp del /q list.tmp
for /f "delims=" %%a in ('dir /b/a-d Call1_*_*.nmf') do (
for /f "tokens=2,* delims=_" %%b in ("%%a") do if not "%%~nc"=="" echo "%%c" "%%a" >>list.tmp
)
set digs=""
for /f "tokens=1,*" %%a in ('sort list.tmp') do call :del_dups %%a %%b
del /q list.tmp
goto :eof

:del_dups
if %digs% == %1 del /q %2
set digs=%1
goto :eof

sampir
18-11-2012, 19:57
Kiripana, огромное Вам спасибо!!! Работает на задаче без всяких исправлений, как есть. Сегодня уже проходил боевое применение на массиве звонков. Все отлично! Еще раз большое спасибо, спасли кучу времени и нервов, из-за возможных ошибок ручной работы.




© OSzone.net 2001-2012