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
Post a Comment