| """findgremlins - Search through a folder and subfolders for |
| text files that have characters with bit 8 set, and print |
| the filename and a bit of context. |
| |
| By Just, with a little glue by Jack""" |
| |
| import EasyDialogs |
| import MacOS |
| import re |
| import os |
| import string |
| import sys |
| |
| xpat = re.compile(r"[\200-\377]") |
| |
| def walk(top, recurse=1): |
| if os.path.isdir(top): |
| if recurse: |
| for name in os.listdir(top): |
| path = os.path.join(top, name) |
| walk(path) |
| else: |
| cr, tp = MacOS.GetCreatorAndType(top) |
| if tp in ('TEXT', '\0\0\0\0') and top[-4:] <> ".hqx": |
| data = open(top).read() |
| badcount = 0 |
| for ch in data[:256]: |
| if ord(ch) == 0 or ord(ch) >= 0200: |
| badcount = badcount + 1 |
| if badcount > 16: |
| print `top`, 'appears to be a binary file' |
| return |
| pos = 0 |
| gotone = 0 |
| while 1: |
| m = xpat.search(data, pos) |
| if m is None: |
| break |
| if not gotone: |
| print `top` |
| gotone = 1 |
| [(i, j)] = m.regs |
| print " ", string.replace(data[i-15:j+15], '\n', ' ') |
| pos = j |
| |
| def main(): |
| if sys.argv[1:]: |
| for pathname in sys.argv[1:]: |
| walk(pathname) |
| else: |
| pathname = EasyDialogs.AskFolder() |
| if pathname: |
| walk(pathname) |
| |
| if __name__ == '__main__': |
| main() |
| |