cmd/prune_dirs.py

55 lines
1.5 KiB
Python

import argparse
import os
import sys
from voussoirkit import betterhelp
from voussoirkit import pathclass
from voussoirkit import pipeable
from voussoirkit import spinal
from voussoirkit import vlogging
log = vlogging.get_logger(__name__, 'prune_dirs')
def prune_dirs(starting):
starting = pathclass.Path(starting)
walker = spinal.walk(starting, yield_directories=True, yield_files=False)
directories = list(walker)
double_check = set()
def pruneme(directory):
log.debug('Checking %s.', directory.absolute_path)
if directory == starting or directory not in starting:
return
if len(directory.listdir()) == 0:
pipeable.stdout(directory.absolute_path)
os.rmdir(directory)
double_check.add(directory.parent)
for directory in directories:
pruneme(directory)
while double_check:
directory = double_check.pop()
pruneme(directory)
def prune_dirs_argparse(args):
return prune_dirs(args.starting)
@vlogging.main_decorator
def main(argv):
parser = argparse.ArgumentParser(
description='''
This program deletes all empty directories which are children of the given
starting directory. The starting directory itself will not be deleted even
if it is empty.
''',
)
parser.add_argument('starting')
parser.set_defaults(func=prune_dirs_argparse)
return betterhelp.go(parser, argv)
if __name__ == '__main__':
raise SystemExit(main(sys.argv[1:]))