{"id":1075,"date":"2013-08-14T13:18:34","date_gmt":"2013-08-14T12:18:34","guid":{"rendered":"http:\/\/www.phillips321.co.uk\/?p=1075"},"modified":"2013-08-14T13:18:34","modified_gmt":"2013-08-14T12:18:34","slug":"md5checker-py-allows-checking-of-file-changes-in-a-directory","status":"publish","type":"post","link":"https:\/\/www.phillips321.co.uk\/2013\/08\/14\/md5checker-py-allows-checking-of-file-changes-in-a-directory\/","title":{"rendered":"md5checker.py &#8211; Allows checking of file changes in a directory"},"content":{"rendered":"<p>So I wanted a quick way to create an MD5 sum of all the files recursively in a directory so i wrote a quick python script to do this.<\/p>\n<p>Basically run the python file and provide the directory you want to check. This will create a new txt file named md5sYYYY-MM-DD-HHMM.txt containing a list of the files found along with their md5sums.<\/p>\n<p>Then to check the the files run it again but provide the file instead of the directory.<br \/>\n<a href=\"https:\/\/www.phillips321.co.uk\/wp-content\/uploads\/2013\/08\/md5checker1.png\"><img loading=\"lazy\" src=\"https:\/\/www.phillips321.co.uk\/wp-content\/uploads\/2013\/08\/md5checker1-300x202.png\" alt=\"md5checker\" width=\"300\" height=\"202\" class=\"aligncenter size-medium wp-image-1077\" srcset=\"https:\/\/www.phillips321.co.uk\/wp-content\/uploads\/2013\/08\/md5checker1-300x202.png 300w, https:\/\/www.phillips321.co.uk\/wp-content\/uploads\/2013\/08\/md5checker1.png 668w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>It will also report if a file has been deleted.<\/p>\n<div class=\"codecolorer-container python vibrant\" style=\"overflow:auto;white-space:nowrap;width:100%;height:300px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/>13<br \/>14<br \/>15<br \/>16<br \/>17<br \/>18<br \/>19<br \/>20<br \/>21<br \/>22<br \/>23<br \/>24<br \/>25<br \/>26<br \/>27<br \/>28<br \/>29<br \/>30<br \/>31<br \/>32<br \/>33<br \/>34<br \/>35<br \/>36<br \/>37<br \/>38<br \/>39<br \/>40<br \/>41<br \/>42<br \/>43<br \/>44<br \/>45<br \/>46<br \/>47<br \/>48<br \/>49<br \/>50<br \/>51<br \/>52<br \/>53<br \/>54<br \/>55<br \/>56<br \/>57<br \/>58<br \/>59<br \/><\/div><\/td><td><div class=\"python codecolorer\"><span class=\"co1\">#!\/usr\/bin\/env python<\/span><br \/>\n<span class=\"co1\"># md5checker.py<\/span><br \/>\n<span class=\"co1\"># version 1.0<\/span><br \/>\n<span class=\"co1\"># www.phillips321.co.uk<\/span><br \/>\n<span class=\"kw1\">import<\/span> <span class=\"kw3\">os<\/span><span class=\"sy0\">,<\/span>hashlib<span class=\"sy0\">,<\/span><span class=\"kw3\">time<\/span><span class=\"sy0\">,<\/span><span class=\"kw3\">sys<\/span><br \/>\n<br \/>\n<span class=\"kw1\">def<\/span> md5_file<span class=\"br0\">&#40;<\/span><span class=\"kw2\">file<\/span><span class=\"sy0\">,<\/span> block_size<span class=\"sy0\">=<\/span><span class=\"nu0\">2<\/span>**<span class=\"nu0\">20<\/span><span class=\"br0\">&#41;<\/span>:<br \/>\n&nbsp; &nbsp; <span class=\"kw1\">try<\/span>:<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; f<span class=\"sy0\">=<\/span><span class=\"kw2\">open<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw2\">file<\/span><span class=\"sy0\">,<\/span><span class=\"st0\">'r'<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw3\">md5<\/span> <span class=\"sy0\">=<\/span> hashlib.<span class=\"kw3\">md5<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">for<\/span> <span class=\"kw3\">chunk<\/span> <span class=\"kw1\">in<\/span> <span class=\"kw2\">iter<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw1\">lambda<\/span>: f.<span class=\"me1\">read<\/span><span class=\"br0\">&#40;<\/span><span class=\"nu0\">8192<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span> b<span class=\"st0\">''<\/span><span class=\"br0\">&#41;<\/span>:<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw3\">md5<\/span>.<span class=\"me1\">update<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw3\">chunk<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; f.<span class=\"me1\">close<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"kw3\">md5<\/span>.<span class=\"me1\">hexdigest<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">except<\/span>:<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"kw2\">None<\/span><br \/>\n<br \/>\n<span class=\"kw1\">def<\/span> checkhashes<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span>:<br \/>\n&nbsp; &nbsp; allgood<span class=\"sy0\">=<\/span><span class=\"nu0\">0<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">print<\/span> <span class=\"st0\">&quot;[+]Scanning files from hashfile %s&quot;<\/span> % <span class=\"kw3\">sys<\/span>.<span class=\"me1\">argv<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span><br \/>\n&nbsp; &nbsp; hashfile<span class=\"sy0\">=<\/span><span class=\"kw2\">open<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw3\">sys<\/span>.<span class=\"me1\">argv<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span><span class=\"st0\">'r'<\/span><span class=\"br0\">&#41;<\/span> <br \/>\n&nbsp; &nbsp; <span class=\"kw1\">for<\/span> line <span class=\"kw1\">in<\/span> hashfile.<span class=\"me1\">readlines<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span>:<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; oldhash<span class=\"sy0\">,<\/span><span class=\"kw2\">file<\/span><span class=\"sy0\">=<\/span>line.<span class=\"me1\">strip<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">split<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">','<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"kw3\">os<\/span>.<span class=\"me1\">path<\/span>.<span class=\"me1\">basename<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw2\">file<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">startswith<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;md5s&quot;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">==<\/span> <span class=\"kw2\">True<\/span> : <span class=\"kw1\">continue<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; actualhash<span class=\"sy0\">=<\/span>md5_file<span class=\"br0\">&#40;<\/span><span class=\"kw2\">file<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span> actualhash<span class=\"sy0\">==<\/span><span class=\"kw2\">None<\/span>:<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">print<\/span> <span class=\"st0\">&quot;[!]File has been deleted: %s&quot;<\/span> % <span class=\"kw2\">file<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">elif<\/span> oldhash <span class=\"sy0\">!=<\/span> actualhash:<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">print<\/span> <span class=\"st0\">&quot;[!]File has changed: %s&quot;<\/span> % <span class=\"kw2\">file<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">print<\/span> <span class=\"st0\">&quot; &nbsp; Old chesksum:&quot;<\/span> + oldhash<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">print<\/span> <span class=\"st0\">&quot; &nbsp; New checksum:&quot;<\/span> + actualhash<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; allgood+<span class=\"sy0\">=<\/span><span class=\"nu0\">1<\/span><br \/>\n&nbsp; &nbsp; hashfile.<span class=\"me1\">close<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span> allgood <span class=\"sy0\">==<\/span> <span class=\"nu0\">0<\/span>: <span class=\"kw1\">print<\/span> <span class=\"st0\">&quot;[+]No files changes&quot;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">else<\/span>: <span class=\"kw1\">print<\/span> <span class=\"st0\">&quot;[!] %d file's has been changed!&quot;<\/span> % allgood<br \/>\n<br \/>\n<span class=\"kw1\">def<\/span> makehashes<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span>:<br \/>\n&nbsp; &nbsp; filename<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;md5s&quot;<\/span>+<span class=\"kw3\">time<\/span>.<span class=\"me1\">strftime<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;%Y-%m-%d-%H%M&quot;<\/span><span class=\"br0\">&#41;<\/span>+<span class=\"st0\">&quot;.txt&quot;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">print<\/span> <span class=\"st0\">&quot;[+]No hashfile provided, creating new list<span class=\"es0\">\\n<\/span>--&gt;&quot;<\/span> + filename<br \/>\n&nbsp; &nbsp; hashfile<span class=\"sy0\">=<\/span><span class=\"kw2\">open<\/span><span class=\"br0\">&#40;<\/span>filename<span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;w+&quot;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">for<\/span> path<span class=\"sy0\">,<\/span> subFolders<span class=\"sy0\">,<\/span> files <span class=\"kw1\">in<\/span> <span class=\"kw3\">os<\/span>.<span class=\"me1\">walk<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw2\">dir<\/span><span class=\"br0\">&#41;<\/span>:<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">for<\/span> <span class=\"kw2\">file<\/span> <span class=\"kw1\">in<\/span> files:<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw3\">sys<\/span>.<span class=\"me1\">stdout<\/span>.<span class=\"me1\">write<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot; &nbsp; &nbsp;[-]&quot;<\/span>+<span class=\"kw3\">os<\/span>.<span class=\"me1\">path<\/span>.<span class=\"me1\">join<\/span><span class=\"br0\">&#40;<\/span>path<span class=\"sy0\">,<\/span><span class=\"kw2\">file<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw2\">hash<\/span><span class=\"sy0\">=<\/span>md5_file<span class=\"br0\">&#40;<\/span><span class=\"kw3\">os<\/span>.<span class=\"me1\">path<\/span>.<span class=\"me1\">join<\/span><span class=\"br0\">&#40;<\/span>path<span class=\"sy0\">,<\/span><span class=\"kw2\">file<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">print<\/span> <span class=\"st0\">&quot; - &quot;<\/span> + <span class=\"kw2\">hash<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hashfile.<span class=\"me1\">write<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw2\">hash<\/span>+<span class=\"st0\">&quot;,&quot;<\/span>+<span class=\"kw3\">os<\/span>.<span class=\"me1\">path<\/span>.<span class=\"me1\">join<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw3\">os<\/span>.<span class=\"me1\">path<\/span>.<span class=\"me1\">abspath<\/span><span class=\"br0\">&#40;<\/span>path<span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span><span class=\"kw2\">file<\/span>+<span class=\"st0\">&quot;<span class=\"es0\">\\n<\/span>&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; hashfile.<span class=\"me1\">close<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">try<\/span>:<br \/>\n&nbsp; &nbsp; <span class=\"kw2\">dir<\/span><span class=\"sy0\">=<\/span><span class=\"kw3\">os<\/span>.<span class=\"me1\">path<\/span>.<span class=\"me1\">join<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw3\">sys<\/span>.<span class=\"me1\">argv<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"co1\">#directory provided<\/span><br \/>\n<span class=\"kw1\">except<\/span>:<br \/>\n&nbsp; &nbsp; <span class=\"kw2\">dir<\/span><span class=\"sy0\">=<\/span><span class=\"kw3\">os<\/span>.<span class=\"me1\">getcwd<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"co1\">#no directory provided (use current working dir)<\/span><br \/>\n<br \/>\n<span class=\"kw1\">if<\/span> <span class=\"kw3\">os<\/span>.<span class=\"me1\">path<\/span>.<span class=\"me1\">isfile<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw3\">os<\/span>.<span class=\"me1\">path<\/span>.<span class=\"me1\">join<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw2\">dir<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">==<\/span> <span class=\"kw2\">True<\/span>: <span class=\"co1\">#file provided, run checkhashes<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw3\">os<\/span>.<span class=\"me1\">path<\/span>.<span class=\"me1\">isfile<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw3\">os<\/span>.<span class=\"me1\">path<\/span>.<span class=\"me1\">join<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw2\">dir<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; checkhashes<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"kw1\">else<\/span>:<br \/>\n&nbsp; &nbsp; <span class=\"co1\">#directory provided, run makehashes<\/span><br \/>\n&nbsp; &nbsp; makehashes<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n","protected":false},"excerpt":{"rendered":"<p>So I wanted a quick way to create an MD5 sum of all the files recursively in a directory so i wrote a quick python script to do this. Basically run the python file and provide the directory you want to check. This will create a new txt file named md5sYYYY-MM-DD-HHMM.txt containing a list of [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1077,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[388,205,389,111],"_links":{"self":[{"href":"https:\/\/www.phillips321.co.uk\/wp-json\/wp\/v2\/posts\/1075"}],"collection":[{"href":"https:\/\/www.phillips321.co.uk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.phillips321.co.uk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.phillips321.co.uk\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.phillips321.co.uk\/wp-json\/wp\/v2\/comments?post=1075"}],"version-history":[{"count":1,"href":"https:\/\/www.phillips321.co.uk\/wp-json\/wp\/v2\/posts\/1075\/revisions"}],"predecessor-version":[{"id":1078,"href":"https:\/\/www.phillips321.co.uk\/wp-json\/wp\/v2\/posts\/1075\/revisions\/1078"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.phillips321.co.uk\/wp-json\/wp\/v2\/media\/1077"}],"wp:attachment":[{"href":"https:\/\/www.phillips321.co.uk\/wp-json\/wp\/v2\/media?parent=1075"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.phillips321.co.uk\/wp-json\/wp\/v2\/categories?post=1075"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.phillips321.co.uk\/wp-json\/wp\/v2\/tags?post=1075"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}