最近买了
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,这里还要多加学习。