def prune_shortcuts(recurse=False, autoyes=False): if recurse: lnks = [file for file in spinal.walk('.') if file.extension == 'lnk'] else: lnks = pathclass.cwd().glob('*.lnk') stale = [] for lnk in lnks: shortcut = winshell.Shortcut(lnk.absolute_path) # There are some special shortcuts that do not have a path, but instead # trigger some action based on a CLSID that Explorer understands. # I can't find this information in the winshell.Shortcut object, so for # now let's at least not delete these files. if shortcut.path == '': continue if not os.path.exists(shortcut.path): stale.append(lnk) if not stale: return print(f'The following {len(stale)} will be recycled:') for lnk in stale: print(lnk.absolute_path) print() if autoyes or interactive.getpermission('Is that ok?'): for lnk in stale: print(lnk.absolute_path) send2trash.send2trash(lnk.absolute_path)
def contentreplace_argparse(args): if args.recurse: files = spinal.walk('.', yield_files=True, yield_directories=False) files = (f for f in files if winglob.fnmatch(f.basename, args.filename_glob)) else: files = pathclass.cwd().glob(args.filename_glob) files = (f for f in files if f.is_file) if args.clip_prompt: replace_from = input('Ready from') if not replace_from: replace_from = pyperclip.paste() replace_to = input('Ready to') if not replace_to: replace_to = pyperclip.paste() else: replace_from = codecs.decode(args.replace_from, 'unicode_escape') if args.do_regex: replace_to = args.replace_to else: replace_to = codecs.decode(args.replace_to, 'unicode_escape') for file in files: try: contentreplace( file, replace_from, replace_to, autoyes=args.autoyes, do_regex=args.do_regex, ) except UnicodeDecodeError: log.error('%s encountered unicode decode error.', file.absolute_path)
def nonempty_directories_argparse(args): if args.patterns: patterns = pipeable.input_many(args.patterns, skip_blank=True, strip=True) directories = (pathclass.Path(d) for pattern in patterns for d in winglob.glob(pattern)) else: directories = pathclass.cwd().listdir() directories = (d for d in directories if d.is_dir) for directory in directories: if len(directory.listdir()) != 0: pipeable.stdout(directory.absolute_path)
def inputrename_argparse(args): if args.recurse: files = (file for file in spinal.walk('.') if args.keyword in file.basename) else: files = (file for file in pathclass.cwd().listdir() if args.keyword in file.basename) prev = None for file in files: print(file.relative_path) this = input('> ') if this == '' and prev is not None: this = prev if this: new_name = file.basename.replace(args.keyword, this) new_name = file.parent.with_child(new_name) os.rename(file.absolute_path, new_name.absolute_path) prev = this
import argparse import os import random import re import sys import unicodedata from voussoirkit import betterhelp from voussoirkit import interactive from voussoirkit import pathclass from voussoirkit import safeprint from voussoirkit import spinal from voussoirkit import stringtools # These constants are provided for use in your eval string cwd = pathclass.cwd() # These variables are provided so that if you have any difficulty typing # literal quotes etc into your command line, you can just use these variable # names in your eval string. apostrophe = "'" dot = '.' hyphen = '-' quote = '"' space = ' ' underscore = '_' # For backwards compatibility, these names which were once locally defined # functions are now just references to stringtools. excise = stringtools.excise title = stringtools.title_capitalize
def main(argv): for file in pathclass.cwd().listdir(): if not file.is_file: continue print(file.stat.st_dev, file.stat.st_ino, file.relative_path)