PowerShell(重複してない内容のファイルを抽出)


アニメ『恋と嘘』

政府が決めた相手と結婚しなければいけない制度の世界なんですが、割と良い制度なんじゃないかなあと思います。本当に最良の相手となるならですが。

(本記事はPowerShell入門記事としてコチラにもまとめています。)

今回は2つのファイル群を作って、内容が一致するものがどれぐらいあるか確認してみます。

ファイルの内容は1~5の数字の組み合わせで作ります。

PS C:\Users\takk\aaa> function 5num(){
>> 1..5 | %{random -min 1 -max 5}
>> }
>>
PS C:\Users\takk\aaa> 5num
4
1
3
1
4
PS C:\Users\takk\aaa>

まず一つ目のファイル群としてdir1を作ってファイルを100個作ります。

PS C:\Users\takk\aaa\dir1> 1..100 | % {$n=1}{5num > file_$n; $n++}
PS C:\Users\takk\aaa\dir1>

ファイルが100個生成されます。

PS C:\Users\takk\aaa\dir1> (ls -name)[0..9]
file_1
file_10
file_100
file_11
file_12
file_13
file_14
file_15
file_16
file_17
PS C:\Users\takk\aaa\dir1>

ファイルの内容はそれぞれ異なります。

PS C:\Users\takk\aaa\dir1> (ls -name | %{echo ===$_===;cat $_})[0..9]
===file_1===
1
2
2
2
2
===file_10===
1
3
4
PS C:\Users\takk\aaa\dir1>

これをもう一つ作ります。

PS C:\Users\takk\aaa\dir2> 1..100 | % {$n=1}{5num > file_$n; $n++}
PS C:\Users\takk\aaa\dir2>

各フォルダにあるファイルのMD5を確認してみましょう。10ファイル分のみ表示しています。
dir1から。

PS C:\Users\takk\aaa> (ls dir1 -file | %{get-filehash -A MD5 dir1/$_})[0..9]

Algorithm       Hash                                        Path
---------       ----                                        ----
MD5             349FE18B709737FF903B301A8D5809AB            C:\Users\takk\aaa\dir1\file_1
MD5             4C710F3E92557BABA923F47C866DEA05            C:\Users\takk\aaa\dir1\file_10
MD5             93172F647FBDEF3634C9242A8053C35D            C:\Users\takk\aaa\dir1\file_100
MD5             B882146EF4FBBBC0DDC759FBEB34B69C            C:\Users\takk\aaa\dir1\file_11
MD5             C9467816275EAE1A54DE45FE6DDB02AE            C:\Users\takk\aaa\dir1\file_12
MD5             AE2933E92ECB3CAEC642A74546833B2A            C:\Users\takk\aaa\dir1\file_13
MD5             4DF661A8583B2FB04E9E3E400EC02ADA            C:\Users\takk\aaa\dir1\file_14
MD5             BC7F41F1B446E09C464F954EA5D86CCA            C:\Users\takk\aaa\dir1\file_15
MD5             7F101CC43794720C7EAA678DC3F3BAB6            C:\Users\takk\aaa\dir1\file_16
MD5             5A60F517FA7C678B158C8CC21CAB27C0            C:\Users\takk\aaa\dir1\file_17


PS C:\Users\takk\aaa>
PS C:\Users\takk\aaa> (ls dir2 -file | %{get-filehash -A MD5 dir2/$_})[0..9]

Algorithm       Hash                                        Path
---------       ----                                        ----
MD5             323D55B920AEA935F72B45210C8F1DDE            C:\Users\takk\aaa\dir2\file_1
MD5             D081F8BFA19B4E3D4B6C024FD3D47B12            C:\Users\takk\aaa\dir2\file_10
MD5             C3E2624D47BBDA6E0AB9516DA993B8F1            C:\Users\takk\aaa\dir2\file_100
MD5             18AE851073AC7A8E1BD9DB693CE4869C            C:\Users\takk\aaa\dir2\file_11
MD5             698A011B551CBD80B7D03703CAA214FD            C:\Users\takk\aaa\dir2\file_12
MD5             F7F795DB9BC48816F20970AF0A98C92D            C:\Users\takk\aaa\dir2\file_13
MD5             11BEC7147D833D0AE3F5A6C3919CAD82            C:\Users\takk\aaa\dir2\file_14
MD5             9D3274BCB6A4FFB288AF03AB7F876A11            C:\Users\takk\aaa\dir2\file_15
MD5             A77636F22FE1124EC21A4F6501D8C540            C:\Users\takk\aaa\dir2\file_16
MD5             81B90CE24BE723830422C977BB6DA7BD            C:\Users\takk\aaa\dir2\file_17


PS C:\Users\takk\aaa>

当然総数は200となります。

PS C:\Users\takk\aaa> (ls -name -re -file | %{(get-filehash -A MD5 $_).hash}).Count
200
PS C:\Users\takk\aaa>

重複していない数を調べます。

PS C:\Users\takk\aaa> (ls -name -re -file | %{(get-filehash -A MD5 $_).hash} | sort | get-unique).Count
183
PS C:\Users\takk\aaa>

183個あったので、重複しているMD5は17個となります。
奇数個あるので、つまり2つずつのセットにはできないですね。

ファイルも合わせて確認するとわかりますが、

PS C:\Users\takk\aaa> ls -name -re -file | %{"{0:s} {0:s}" -f (get-filehash -A MD5 $_).hash ,$_} | sort
C9467816275EAE1A54DE45FE6DDB02AE dir1\file_12
C9467816275EAE1A54DE45FE6DDB02AE dir1\file_52

同じdir1フォルダに一致する内容のファイルがありました。

なるほど、一致するのは同性の場合もあるんですね。

コメント

タイトルとURLをコピーしました