{ "info": { "author": "\u0141ukasz Langa", "author_email": "lukasz@langa.pl", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Programming Language :: Python", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: System :: Filesystems", "Topic :: System :: Monitoring" ], "description": "======\nbitrot\n======\n\nDetects bit rotten files on the hard drive to save your precious photo\nand music collection from slow decay.\n\nUsage\n-----\n\nGo to the desired directory and simply invoke::\n\n $ bitrot\n\nThis will start digging through your directory structure recursively\nindexing all files found. The index is stored in a ``.bitrot.db`` file\nwhich is a SQLite 3 database.\n\nNext time you run ``bitrot`` it will add new files and update the index\nfor files with a changed modification date. Most importantly however, it\nwill report all errors, e.g. files that changed on the hard drive but\nstill have the same modification date.\n\nAll paths stored in ``.bitrot.db`` are relative so it's safe to rescan\na folder after moving it to another drive.\n\nPerformance\n-----------\n\nObviously depends on how fast the underlying drive is. Since bandwidth\nfor checksum calculations is greater than your drive's data transfer\nrate, even when comparing mobile CPUs vs. SSD drives, the script is\nsingle-threaded.\n\nNo rigorous performance tests have been done. Scanning a ~1000 files\ntotalling ~4 GB takes 20 seconds on a 2015 Macbook Air (SM0256G SSD).\nThis is with cold disk cache.\n\nSome other tests back from 2013: a typical 5400 RPM laptop hard drive\nscanning a 60+ GB music library took around 15 minutes. On an OCZ\nVertex 3 SSD drive ``bitrot`` was able to scan a 100 GB Aperture library\nin under 10 minutes. Both tests on HFS+.\n\nIf you'd like to contribute some more rigorous eenchmarks or any\nperformance improvements, I'm accepting pull requests! :)\n\nChange Log\n----------\n\n0.9.2\n~~~~~\n\n* bugfix: one place in the code incorrectly hardcoded UTF-8 as the\n filesystem encoding\n\n0.9.1\n~~~~~\n\n* bugfix: print the path that failed to decode with FSENCODING\n\n* bugfix: when using -q, don't hide warnings about files that can't be\n statted or read\n\n* bugfix: -s is no longer broken on Python 3\n\n0.9.0\n~~~~~\n\n* bugfix: bitrot.db checksum checking messages now obey --quiet\n\n* Python 3 compatibility\n\n0.8.0\n~~~~~\n\n* bitrot now keeps track of its own database's bitrot by storing\n a checksum of .bitrot.db in .bitrot.sha512\n\n* bugfix: now properly uses the filesystem encoding to decode file names\n for use with the .bitrotdb database. Report and original patch by\n pallinger.\n\n0.7.1\n~~~~~\n\n* bugfix: SHA1 computation now works correctly on Windows; previously\n opened files in text-mode. This fix will change hashes of files\n containing some specific bytes like 0x1A.\n\n0.7.0\n~~~~~\n\n* when a file changes or is renamed, the timestamp of the last check is\n updated, too\n\n* bugfix: files that disappeared during the run are now properly ignored\n\n* bugfix: files that are locked or with otherwise denied access are\n skipped. If they were read before, they will be considered \"missing\"\n in the report.\n\n* bugfix: if there are multiple files with the same content in the\n scanned directory tree, renames are now handled properly for them\n\n* refactored some horrible code to be a little less horrible\n\n0.6.0\n~~~~~\n\n* more control over performance with ``--commit-interval`` and\n ``--chunk-size`` command-line arguments\n\n* bugfix: symbolic links are now properly skipped (or can be followed if\n ``--follow-links`` is passed)\n\n* bugfix: files that cannot be opened are now gracefully skipped\n\n* bugfix: fixed a rare division by zero when run in an empty directory\n\n0.5.1\n~~~~~\n\n* bugfix: warn about test mode only in test mode\n\n0.5.0\n~~~~~\n\n* ``--test`` command-line argument for testing the state without\n updating the database on disk (works for testing databases you don't\n have write access to)\n\n* size of the data read is reported upon finish\n\n* minor performance updates\n\n0.4.0\n~~~~~\n\n* renames are now reported as such\n\n* all non-regular files (e.g. symbolic links, pipes, sockets) are now\n skipped\n\n* progress presented in percentage\n\n0.3.0\n~~~~~\n\n* ``--sum`` command-line argument for easy comparison of multiple\n databases\n\n0.2.1\n~~~~~\n\n* fixed regression from 0.2.0 where new files caused a ``KeyError``\n exception\n\n0.2.0\n~~~~~\n\n* ``--verbose`` and ``--quiet`` command-line arguments\n\n* if a file is no longer there, its entry is removed from the database\n\n0.1.0\n~~~~~\n\n* First published version.\n\nAuthors\n-------\n\nGlued together by `\u0141ukasz Langa `_. Multiple\nimprovements by `Yang Zhang `_, `Jean-Louis\nFuchs `_, `Phil Lundrigan\n`_, `Ben Shepherd\n`_.", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/ambv/bitrot/", "keywords": "file checksum database", "license": "MIT", "maintainer": null, "maintainer_email": null, "name": "bitrot", "package_url": "https://pypi.org/project/bitrot/", "platform": "any", "project_url": "https://pypi.org/project/bitrot/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/ambv/bitrot/" }, "release_url": "https://pypi.org/project/bitrot/0.9.2/", "requires_dist": null, "requires_python": null, "summary": "Detects bit rotten files on the hard drive to save your precious photo and music collection from slow decay.", "version": "0.9.2" }, "last_serial": 2435878, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "a7659f4dd43441e5c95c0544105be526", "sha256": "33a2a69e8e5409ad1e970e632a65665f1a0728c2694c5f8b9ecdc300d0f21178" }, "downloads": -1, "filename": "bitrot-0.1.0.tar.gz", "has_sig": false, "md5_digest": "a7659f4dd43441e5c95c0544105be526", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4045, "upload_time": "2013-01-17T22:00:12", "url": "https://files.pythonhosted.org/packages/66/4d/a4c0747a88993208784f92bb51539cccb2f12f43f33a570d4e86990bd4e9/bitrot-0.1.0.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "b5b04287774bc9691ceda14bc7af64a3", "sha256": "9472927b5e9f54d48a4adc3343e34a4b8944101047e75edb1247e6445f9cac58" }, "downloads": -1, "filename": "bitrot-0.2.0.tar.gz", "has_sig": false, "md5_digest": "b5b04287774bc9691ceda14bc7af64a3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4720, "upload_time": "2013-02-10T18:21:19", "url": "https://files.pythonhosted.org/packages/8d/76/97eb1ad40cbeaa0b3ef4fb37cde67c17d885ecb9cd7a726d3d4943202c06/bitrot-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "8587a974b3505d86f298bd9b88408a6f", "sha256": "3c9a4ecd65885b40ff0ed6f397ed477efea12397d97683025e72d9f0c84bee30" }, "downloads": -1, "filename": "bitrot-0.2.1.tar.gz", "has_sig": false, "md5_digest": "8587a974b3505d86f298bd9b88408a6f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4779, "upload_time": "2013-02-12T10:29:50", "url": "https://files.pythonhosted.org/packages/1f/1e/99e63cdf58507be736693241ee1500c124d4539392a0f46ea8c1fff01ed9/bitrot-0.2.1.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "967d6b0995d246b831f648dbb566b5f5", "sha256": "0016a8a19e3f6561adcd8eea7314d88d9b66dce4b56e28f37cd118549105281f" }, "downloads": -1, "filename": "bitrot-0.3.0.tar.gz", "has_sig": false, "md5_digest": "967d6b0995d246b831f648dbb566b5f5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5063, "upload_time": "2013-02-26T14:54:49", "url": "https://files.pythonhosted.org/packages/75/83/4beafd48e54c567f376e9437d01dabe659b456b71aecb6475db1a318e442/bitrot-0.3.0.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "6924204414a294cb07e8f318ee4a6522", "sha256": "a598c55f3b7e73e6b2eb818a7269d25e370615bd7c4723f5465db96ca678d68e" }, "downloads": -1, "filename": "bitrot-0.4.0.tar.gz", "has_sig": false, "md5_digest": "6924204414a294cb07e8f318ee4a6522", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5400, "upload_time": "2013-03-03T23:51:46", "url": "https://files.pythonhosted.org/packages/ed/d3/5f7cf618579b126c05405407f4ce065a388fa26a90172d50ead6e25b019a/bitrot-0.4.0.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "501b4698c2731cd2040fca943436f2fd", "sha256": "4c201115e2dd544c675f17a53f9c8e6b231600a19017383ab10fb5768ff8c3ec" }, "downloads": -1, "filename": "bitrot-0.5.0.tar.gz", "has_sig": false, "md5_digest": "501b4698c2731cd2040fca943436f2fd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5846, "upload_time": "2013-03-15T22:18:11", "url": "https://files.pythonhosted.org/packages/fc/9d/88aaeeb2fa654fb9df2d011c20ab431339291c1fba0f28d710d0c2f057e1/bitrot-0.5.0.tar.gz" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "24d816479353eb1cdf08a1b98cfdaf8e", "sha256": "341fb7feae9986ebda294c405b0f3655ae8949c7a38bebd33aa5376c594fb50f" }, "downloads": -1, "filename": "bitrot-0.5.1.tar.gz", "has_sig": false, "md5_digest": "24d816479353eb1cdf08a1b98cfdaf8e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5885, "upload_time": "2013-03-18T05:39:07", "url": "https://files.pythonhosted.org/packages/4d/0e/d9bdb20b3c9097125972cea125ca72654e2a5623ac11edadac8001f0c87b/bitrot-0.5.1.tar.gz" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "04da41ba3fe40e69e9d31b04a39fd802", "sha256": "a5e0f387de46c04c333fff487331b73c4c3079ae96703cca18d69767777ec9e7" }, "downloads": -1, "filename": "bitrot-0.6.0.tar.gz", "has_sig": false, "md5_digest": "04da41ba3fe40e69e9d31b04a39fd802", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6756, "upload_time": "2013-11-11T08:45:28", "url": "https://files.pythonhosted.org/packages/35/64/8f4d44ecdde13738be57d69c7a2f7f4a6479a0be98f3092c6faa30337158/bitrot-0.6.0.tar.gz" } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "5092741fd9bddaea6680e24f54ef71c1", "sha256": "52ef0e1ee5b52c0a456d4df4ac431d3cb601cbc465069c629a50774705a8abee" }, "downloads": -1, "filename": "bitrot-0.7.0.tar.gz", "has_sig": false, "md5_digest": "5092741fd9bddaea6680e24f54ef71c1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8072, "upload_time": "2015-06-23T01:09:20", "url": "https://files.pythonhosted.org/packages/58/e8/1c3878aa3f46c46c78cc1f070e3ce296163c0d5386c9bf581996efe6ab9f/bitrot-0.7.0.tar.gz" } ], "0.7.1": [ { "comment_text": "", "digests": { "md5": "9132e9550e3a8aad6bee4b00fa11804d", "sha256": "6c93330a63bebda7b481285243428036ee7b3c6eaca8973d36f3e6424eb8ec02" }, "downloads": -1, "filename": "bitrot-0.7.1.tar.gz", "has_sig": false, "md5_digest": "9132e9550e3a8aad6bee4b00fa11804d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8973, "upload_time": "2016-05-03T00:51:34", "url": "https://files.pythonhosted.org/packages/d8/39/d1f410d44a74159130ed7619b92bb725c198b31e51f15d75d8f8e9d884ef/bitrot-0.7.1.tar.gz" } ], "0.8.0": [ { "comment_text": "", "digests": { "md5": "b5b3bb3cadd5d900120bd350b101b2d8", "sha256": "3c2f9116ac67d4bc428679961bd2fb34894abf3cccb90b1f42f5af201d4ec1a2" }, "downloads": -1, "filename": "bitrot-0.8.0.tar.gz", "has_sig": false, "md5_digest": "b5b3bb3cadd5d900120bd350b101b2d8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8970, "upload_time": "2016-05-03T00:53:11", "url": "https://files.pythonhosted.org/packages/1a/dd/9ae1ec865bca52e6a430f6e9da178e4c42828a134ba9d8b50da3cf7f8709/bitrot-0.8.0.tar.gz" } ], "0.9.0": [ { "comment_text": "", "digests": { "md5": "84ab6b103096ca9a7d0f15168178ac87", "sha256": "dca73e1694f19c9b7c1bc0514502a6f02fc29472950b1f5653ab6ba8f187ed74" }, "downloads": -1, "filename": "bitrot-0.9.0.tar.gz", "has_sig": false, "md5_digest": "84ab6b103096ca9a7d0f15168178ac87", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9159, "upload_time": "2016-08-09T21:53:12", "url": "https://files.pythonhosted.org/packages/bf/d0/7b847198b3db9016c887060f80fd0992e860bd331077f067a3aa0f1bef8a/bitrot-0.9.0.tar.gz" } ], "0.9.1": [ { "comment_text": "", "digests": { "md5": "eac3c3c60e56c1b25f841ebfbca951c9", "sha256": "be138f8a32a90925b8ab5c3960c5cec8dff7005852b5aa5187c3351566f57f23" }, "downloads": -1, "filename": "bitrot-0.9.1.tar.gz", "has_sig": false, "md5_digest": "eac3c3c60e56c1b25f841ebfbca951c9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9219, "upload_time": "2016-10-30T02:27:36", "url": "https://files.pythonhosted.org/packages/a9/fa/caf77c808aa7e1fd8ec1049a775355e07b083a5b22db21e6994b1468fa6c/bitrot-0.9.1.tar.gz" } ], "0.9.2": [ { "comment_text": "", "digests": { "md5": "0837842feb5b9ee4a25ad35548dd5bbe", "sha256": "f80414852ae0ac33e47e7d488da6b13332732f57999d160ae55bd4d500e14706" }, "downloads": -1, "filename": "bitrot-0.9.2.tar.gz", "has_sig": false, "md5_digest": "0837842feb5b9ee4a25ad35548dd5bbe", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9699, "upload_time": "2016-11-01T19:02:51", "url": "https://files.pythonhosted.org/packages/05/7c/1d721cb13833372e2f869861d94630e7b29a723fdde566154b0519d9e1e4/bitrot-0.9.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "0837842feb5b9ee4a25ad35548dd5bbe", "sha256": "f80414852ae0ac33e47e7d488da6b13332732f57999d160ae55bd4d500e14706" }, "downloads": -1, "filename": "bitrot-0.9.2.tar.gz", "has_sig": false, "md5_digest": "0837842feb5b9ee4a25ad35548dd5bbe", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9699, "upload_time": "2016-11-01T19:02:51", "url": "https://files.pythonhosted.org/packages/05/7c/1d721cb13833372e2f869861d94630e7b29a723fdde566154b0519d9e1e4/bitrot-0.9.2.tar.gz" } ] }