Created
July 8, 2015 18:22
-
-
Save dhylands/a73e828f11f49e2c681d to your computer and use it in GitHub Desktop.
Exercise to implement some recursive directory scaning
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python3 | |
import grp | |
import os | |
import pwd | |
import stat | |
import sys | |
import time | |
SIX_MONTHS = 6 * 30 * 86400 | |
def ls(dir): | |
print('%s:' % dir) | |
entries = tuple((filename, os.stat(dir + '/' + filename)) for filename in os.listdir(dir)) | |
filtered_entries = [] | |
for entry in entries: | |
filename = entry[0] | |
if filename[0] != '.': | |
filtered_entries.append(entry) | |
total_size = sum((entry[1][stat.ST_SIZE] + 4095) // 4096 * 4 for entry in filtered_entries) | |
print('total %d' % total_size) | |
curr_time = time.time() | |
sizes = [entry[1][stat.ST_SIZE] for entry in filtered_entries] | |
if len(sizes) > 0: | |
max_size = max(sizes) | |
else: | |
max_size = 0 | |
size_width = len('%d' % max_size) | |
sorted_entries = sorted(filtered_entries, key=lambda e: e[0].lower()) | |
for entry in sorted_entries: | |
filename = entry[0] | |
filestat = entry[1] | |
mode = filestat[stat.ST_MODE] | |
num_links = filestat[stat.ST_NLINK] | |
uid = filestat[stat.ST_UID] | |
gid = filestat[stat.ST_GID] | |
size = filestat[stat.ST_SIZE] | |
mtime = filestat[stat.ST_MTIME] | |
mode_str = '' | |
mode_str += 'd' if stat.S_ISDIR(mode) else '-' | |
mode_str += 'r' if mode & stat.S_IRUSR else '-' | |
mode_str += 'w' if mode & stat.S_IWUSR else '-' | |
mode_str += 'x' if mode & stat.S_IXUSR else '-' | |
mode_str += 'r' if mode & stat.S_IRGRP else '-' | |
mode_str += 'w' if mode & stat.S_IWGRP else '-' | |
mode_str += 'x' if mode & stat.S_IXGRP else '-' | |
mode_str += 'r' if mode & stat.S_IROTH else '-' | |
mode_str += 'w' if mode & stat.S_IWOTH else '-' | |
mode_str += 'x' if mode & stat.S_IXOTH else '-' | |
uname = pwd.getpwuid(uid)[0] | |
gname = grp.getgrgid(gid)[0] | |
ltime = time.localtime(mtime) | |
time_str = time.strftime('%b ', ltime) | |
time_str += '%2d ' % ltime.tm_mday | |
if mtime < curr_time - SIX_MONTHS or mtime > curr_time + SIX_MONTHS: | |
time_str += time.strftime(' %Y', ltime) | |
else: | |
time_str += time.strftime('%H:%M', ltime) | |
print('%s %d %-8s %-8s %*d %s %s' % (mode_str, num_links, uname, gname, size_width, size, time_str, filename)) | |
for entry in sorted_entries: | |
filename = entry[0] | |
filestat = entry[1] | |
mode = filestat[stat.ST_MODE] | |
if stat.S_ISDIR(mode): | |
print() | |
ls(dir + '/' + filename) | |
ls('.') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment