41 lines
1.4 KiB
Python
Executable file
41 lines
1.4 KiB
Python
Executable file
#! /usr/bin/env python3
|
|
# encoding: utf-8
|
|
|
|
import argparse
|
|
import os
|
|
import pathlib
|
|
import random
|
|
import shlex
|
|
|
|
def list_leaf_dirs(root, follow):
|
|
for path, subdirs, _ in os.walk(root, followlinks=follow):
|
|
if not subdirs:
|
|
yield path
|
|
|
|
if __name__ == "__main__":
|
|
parser = argparse.ArgumentParser(description="Lists all leaf subdirectories (those not containing any more subdirectories) below PATH.")
|
|
parser.add_argument(dest="PATH", type=pathlib.Path, nargs="*", default=[pathlib.Path()], help="paths to list leaf subdirs of")
|
|
parser.add_argument("-q", "--quote", dest="quote", action="store_const", const=True, default=False, help="quote lines of output (for easier shell processing)")
|
|
parser.add_argument("-f", "--follow", dest="follow", action="store_const", const=True, default=False, help="follow symlinks")
|
|
parser.add_argument("-n", "--null", dest="null", action="store_const", const=True, default=False, help="use null separators instead of newlines")
|
|
parser.add_argument("-s", "--shuffle", dest="shuffle", action="store_const", const=True, default=False, help="randomize directory order")
|
|
args = parser.parse_args()
|
|
|
|
dirs = []
|
|
|
|
for d in args.PATH:
|
|
dirs.extend(list_leaf_dirs(d, args.follow))
|
|
|
|
outdirs = []
|
|
|
|
if args.quote:
|
|
for d in dirs:
|
|
outdirs.append(shlex.quote(d))
|
|
else:
|
|
outdirs = dirs
|
|
|
|
if args.shuffle:
|
|
random.shuffle(outdirs)
|
|
|
|
sep = "\0" if args.null else "\n"
|
|
print(sep.join(outdirs), end="" if args.null else "\n")
|