File: mergeall-android11-updates-media/MORE--logs-and-code/iospeed.py

#!/usr/bin/python3
"""
================================================================================
Run with 'python iospeed.py path?' in Termux or Pydroid 3.  Give the path of the
tree to walk in either the TREE setting below or a sole command-line argument.
This script does what Mergeall compare-only ('-report') runs do, but Mergeall 
generally walks two tree copies in parallel; filters out system-metadata files
(e.g., .DS_Store); and compares files by timestamps and sizes in the fetched 
stat info.  Mergeall likely calls C's readlink() per dir and lstat() per file.
================================================================================
"""

import sys, os, stat, time
trace = lambda *ka, **pa: None   # or print

TREE = '/sdcard/MY-STUFF'        # EDIT ME: default path of folder to walk
SKIP = '__bkp__'                 # mergeall backups folder (else moot)
if len(sys.argv) > 1: 
    TREE = sys.argv[1]           # command-line arg? explicit folder path

class Counts:
    files = links = dirs = other = 0

def comparetree(dirpath):
    trace('...', dirpath, flush=True)
    nameshere = os.listdir(dirpath)               # <= C libr IO call (dir)
    if SKIP in nameshere:
        nameshere.remove(SKIP)
   
    for namehere in nameshere:
        pathhere = dirpath + os.sep + namehere
        stathere = os.lstat(pathhere)             # <= C lib IO call (file)

        if stat.S_ISLNK(stathere.st_mode):
            Counts.links += 1
            linkpath = os.readlink(pathhere)      # <= C lib IO call (link)

        elif stat.S_ISREG(stathere.st_mode):
            Counts.files += 1
            pass  # mergeall compares stat info here

        elif stat.S_ISDIR(stathere.st_mode):
            Counts.dirs += 1
            comparetree(pathhere)

        else:
            Counts.other += 1

print('Walking', TREE, '...')

start = time.perf_counter()
comparetree(TREE)
stop = time.perf_counter()
elapsed = stop - start 

print('Runtime: {:,.3f} seconds'.format(elapsed))
print('Counts:', {key: val for (key, val) in Counts.__dict__.items() if key[0] != '_'})



[Home page] Books Code Blog Python Author Train Find ©M.Lutz