【笨办法学python 进阶版】【ex06_find】笨办法实现--find部分命令

笨办法实现以下几个find命令

最近买了
learn-more-python-the-hard-way
其中习题6 find命令,
仅此记录和作者不一样的实现版本

test_find.py  ./  -name "*.txt"  -print
test_find.py  ./  -type f    -print
test_find.py  ./  -type d   -print

test123 为一个目录

test_find.py  ./test123  -type d  -exec rm {} \;
test_find.py  ./test123  -type  f  -exec rm {} \;
test_find.py  ./test123  -name "*.txt" -exec rm {} \;

下面是test_find.py 脚本

import argparse, os
import re, shutil

parse = argparse.ArgumentParser()
parse.add_argument("filepath", help="file path")
##下面的metavar和choices都可以
# parse.add_argument("-name", nargs='*', metavar=['*.txt'])
parse.add_argument("-name", nargs=1, choices=['*.txt'])
####下面metavar和choices都可以
parse.add_argument("-type", nargs=1, metavar=['d','f'])
# parse.add_argument("-type", nargs=1, choices=['d','f'])
parse.add_argument("-print", action="store_true")
parse.add_argument("-exec", nargs='*', metavar=['rm {} \;'])
args = parse.parse_args()

#########re.compile('*.txt')会报错 re.error: nothing to repeat at position 0
if args.name:
    regex = re.compile('.' + args.name[0])
    for root, dirs, files in os.walk(args.filepath):
        for file in files:
            if   regex.search(file) != None:
                if args.print:
                    print(os.path.join(root, regex.search(file).group()))
                elif args.exec:
                    os.remove(os.path.join(root, file))

if args.type:
    for root, dirs, files in os.walk(args.filepath):
        if args.type[0] == 'f':
            for file in files:
                if args.print:
                    print(os.path.join(root, file))
                elif args.exec:
                    os.remove(os.path.join(root, file))
        elif args.type[0] == 'd':
           for dir in dirs:
               if args.print:
                    print(os.path.join(root, dir))
               elif args.exec:
                    shutil.rmtree(os.path.join(root, dir))

说明

我的环境:
1、pycharm python3.7 环境;
2、遍历目录原作者使用的pathlib的rglob(),而我首先想到的是os.walk();
3、原作者实现的命令是:

python3.6 find.py ..   --type f  --name "*.txt"

这样的命令,而我没考虑 -type 和-name参数同时输入的情形,-name的时候我只想到了文件匹配,忘了匹配文件夹,
另外原作者还重构了函数,比较简洁,而我只是简单的判断了一下if args.name,if args.type,这里还要多加学习。

你可能感兴趣的:(python)