Sorting files by filename


hi all

i have folder lot of files , need delete every second file. example:

some_name.4.1 .2007.09.12.09.ima

some_name.4.2 .2007.09.12.09.ima

some_name.4.3 .2007.09.12.09.ima

...

some_name.4.10 .2007.09.12.09.ima

i want delete files 4.2, 4.4, 4.6 , on. problem sort order of files. when sort files name "dir | sort name " following result:

some_name.4.1. 2007.09.12.09.ima

some_name.4.10 .2007.09.12.09.ima

some_name.4.100 .2007.09.12.09.ima

how can sort files, sorted in windows explorer:

some_name.4.1. 2007.09.12.09.ima

some_name.4.2 .2007.09.12.09.ima

...

some_name.4.9 .2007.09.12.09.ima

some_name.4.10 .2007.09.12.09.ima

regards

 

 

sorry that.  yes, % alias foreach-object.  <filespec> not intended used litereally, replaced filespec of actual location , names of files on system.

i replace alias, and ran against test files on system:

 

gci c:\testfiles\some_name*

  directory: c:\testfiles


mode                lastwritetime     length name                                                             
----                -------------     ------ ----                                                             
-a---         12/3/2010   5:11 am          5 some_name.4.1 .2007.09.12.09.ima                                 
-a---         12/3/2010   5:12 am          5 some_name.4.1.2007.09.12.09.ima                                  
-a---         12/3/2010   5:12 am          5 some_name.4.10.2007.09.12.09.ima                                 
-a---         12/3/2010   5:12 am          5 some_name.4.100.2007.09.12.09.ima                                
-a---         12/3/2010   5:12 am          5 some_name.4.2.2007.09.12.09.ima                                  
-a---         12/3/2010   5:12 am          5 some_name.4.3.2007.09.12.09.ima                                  
-a---         12/3/2010   5:13 am          5 some_name.4.9.2007.09.12.09.ima                                  

$a = gci  c:\testfiles\some_name* | foreach-object {
$_ -match "^\d+\.(\d+\.\d+)\." > $null
$_ | add-member -membertype noteproperty -name vname -value ([version]$matches[1])
$_
}

$a | sort vname

 

-a---         12/3/2010   5:12 am          5 some_name.4.1.2007.09.12.09.ima                                  
-a---         12/3/2010   5:12 am          5 some_name.4.2.2007.09.12.09.ima                                  
-a---         12/3/2010   5:12 am          5 some_name.4.3.2007.09.12.09.ima                                  
-a---         12/3/2010   5:13 am          5 some_name.4.9.2007.09.12.09.ima                                  
-a---         12/3/2010   5:11 am          5 some_name.4.1 .2007.09.12.09.ima                                 
-a---         12/3/2010   5:12 am          5 some_name.4.10.2007.09.12.09.ima                                 
-a---         12/3/2010   5:12 am          5 some_name.4.100.2007.09.12.09.ima      

 

the script taking filename, , using regex find , capture 4.xxx sequences. 

it's not specific, , may need adjusted actual file names.  starting @ beginning of name, it's lookin 1 or more non-digit characters, followed dot, followed 1 or more digits, another dot, 1 or more digits followed dot again, , capturing digit(s)-dot-digit(s) sequence.

if doesn't work against actual file names, can adjust does. 

then adds sequence object note property of type [version].  this special object type used things like file versions, , has sort characteristics you're looking for.

then we add property (vname) objects you can use sort on.

after thinking little more it's obvious rest of file name needs part of sort, also.  added 2 more captures "some_name" , date sequences, , added sort.  code looks this:

$a = gci  c:\testfiles\some_name* | foreach-object {
$_ -match "^(\d+\.)(\d+\.\d+)(\..+)" > $null
$_ | add-member -membertype noteproperty -name vname1 -value ($matches[1])
$_ | add-member -membertype noteproperty -name vname2 -value ([version]$matches[2])
$_ | add-member -membertype noteproperty -name vname3 -value ($matches[3])
$_
}

$a | sort vname1,vname2,vname3

note middle 1 cast type [version].

                          


[string](0..33|%{[char][int](46+("686552495351636652556262185355647068516270555358646562655775 0645570").substring(($_*2),2))})-replace " "


Windows Server  >  Windows PowerShell



Comments

Popular posts from this blog

Group Policy Event ID 1058 Error Code 1326 (The user name or password is incorrect)

Suspicious event log Event ID: 4905

DCOM received error "2147746132" from...