# 练习 6:`find`
> 原文:[Exercise 6: find](https://learncodethehardway.org/more-python-book/ex6.html)
> 译者:[飞龙](https://github.com/wizardforcel)
> 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
> 自豪地采用[谷歌翻译](https://translate.google.cn/)
希望你正在发现阻碍自己的各种方式,甚至在你开始工作之前。也许这不是戏剧性的,但你至少应该确定你在环境中可以改善的东西,它们使你难以开始工作。这些小练习是你专注于开始的一个好方法,因为它们不是那么重要,并且能够放进一个适合你分析的时间尺度。如果这些项目有几个小时那么长,当你复查你做了什么,并做出改进的时候,你会觉得无聊,短暂的45分钟的项目,是你可以记录和非常快速审查的东西。
这是我在学习中使用的一种模式。我会识别我需要改进的东西,例如我如何开始,或者我如何使用一个工具。然后我会设计一个练习来关注它。当我正在学习画画时,我外出并努力画树。我坐下来看着问题,我发现的第一件事就是我拖住了太多的东西。我也把我所有的东西都放在我公寓附近的随机的地方。我为我的绘画用品购买了一个特定的包,并保持这个包是准备好的。当我想在外面画画时,我拿起这个包,走到几个地方之一,而不是精心规划到哪里绘画。我练习拿起我的包,走到两个地方之一,准备好,画一幅画,然后回家,直到我像丝绸一样平滑。之后我看了 Bob Ross 的作品,弄清如何画树,因为这个家伙可以很快画出来很多树。
这是你应该做的。很多人在他们的工作领域浪费时间和精力。你是否有一个专门的工作场所,永远不会改变吗?我放弃了我的笔记本电脑,现在只需要使用台式机,这样我就可以在一致的地方做我的工作。这也让我的背部和颈部不用拖着这块金属,给了我更大的工作屏幕,都提高了我的工作能力。在这个练习中,我希望你专注于你的工作领域,并确保在开始之前准备好:
+ 你有足够的光线吗?你需要更少的光线吗?
+ 你的椅子怎么样?你需要一个更好的键盘吗?
+ 还有什么其他工具妨碍你了?你在 Windows 机器上尝试执行 Unix 的东西吗?试图在 Linux 上做 Mac 的东西?不要去买一台新电脑,但是如果你发现你想要做的事情太多,那么请考虑花一笔大的开销。
+ 你的桌子怎么样?你有没有一个?你整天都在咖啡馆使用可怕的椅子和咖啡吗?
+ 音乐怎么样?你听带歌词的音乐吗?我发现如果我听音乐没有歌词,我更容易专注于我的头脑中的声音,帮助我写作或编程。
+ 你在开放式办公室工作,你的同事烦人吗?去买一双盖过耳朵的大耳机。当你戴着它们时,很明显你没有投入注意力,所以人们会离开你,比起你插上耳机而他们看不见,这样他们会觉得更温和一些。这也会阻止分心,并帮助你集中精力。
用这个练习来思考这样的主题,并试图简化和改善你的环境。有一件事 - 不要花很多钱买奇奇怪怪的工具。只需确定问题,然后尝试找到解决方法。
## 挑战练习
在这个挑战中,你要实现用于查找文件的`find`工具的基本版本。像这样运行`find`:
```
find . -name "*.txt" -print
```
这将搜索当前目录中以`.txt`结尾的每个文件,并将其打印出来。 `find`的命令行参数数量很多,所以你不应该在45分钟内实现它们。`find`的一般格式是:
+ 开始搜索的目录:`.`或`/usr/local/`。
+ 一个过滤器参数,如`-name`或`-type d`(目录类型的文件)。
+ 对每个找到的文件执行的操作:`-print`。
你可以执行有用的操作,例如在每个找到的文件上执行命令。如果要删除主目录中的每个Ruby文件,可以执行以下操作:
```
find . -name "*.rb" -exec rm {} \;
```
请不要运行它,除非意识到它会删除所有以`.rb`结尾的文件。`-exec`参数需要一个命令,将`{}`的任何实例替换为文件的名称,然后碰到`;`(分号)时停止读取命令。在前面的命令中我们使用`\;`,因为 bash 和许多其他 shell 使用`;`(分号)作为他们的语言的一部分,所以我们必须转义它。
这个练习将真正测试你使用`argparse`或`sys.argv`的能力。我建议你运行`man`找到参数列表,然后尝试使用`find`来确定你将要实现什么参数。你只有45分钟,所以你可能不会实现太多,但是`-name`和`-type`,以及`-print`和`-exec`是必不可少的。`-exec`参数将是一个挑战,所以将它保存到最后。
当你实现它的时候,尝试找到可以为你做的工作的库。你一定要查看`subprocess`模块和`glob`模块。同时要更仔细地查看`os`模块。
## 研究性学习
+ 你实现了多少`find`的功能?
+ 你发现用于改进这个实现的库是什么?
+ 你将库的查找计算在45分钟内了吗?你可以说,开始 Hack 之前的研究并不算在内,这样做完全没有问题。如果你想要额外的挑战,那么就将你的研究包括在45分钟内。
## 深入学习
你可以在 45 分钟的 Hack 内实现多少`find`的功能?也许把它作为下一个星期的黑客热身挑战,来看看你能做些什么。记住,你应该试图拼凑出最好的、最丑陋的黑魔法。别担心,我不会告诉那些敏捷的人,你只是玩玩而已。
- 笨办法学 Python · 续 中文版
- 引言
- 第一部分:预备知识
- 练习 0:起步
- 练习 1:流程
- 练习 2:创造力
- 练习 3:质量
- 第二部分:简单的黑魔法
- 练习 4:处理命令行参数
- 练习 5:cat
- 练习 6:find
- 练习 7:grep
- 练习 8:cut
- 练习 9:sed
- 练习 10:sort
- 练习 11:uniq
- 练习 12:复习
- 第三部分:数据结构
- 练习 13:单链表
- 练习 14:双链表
- 练习 15:栈和队列
- 练习 16:冒泡、快速和归并排序
- 练习 17:字典
- 练习 18:性能测量
- 练习 19:改善性能
- 练习 20:二叉搜索树
- 练习 21:二分搜索
- 练习 22:后缀数组
- 练习 23:三叉搜索树
- 练习 24:URL 快速路由
- 第四部分:进阶项目
- 练习 25:xargs
- 练习 26:hexdump
- 练习 27:tr
- 练习 28:sh
- 练习 29:diff和patch
- 第五部分:文本解析
- 练习 30:有限状态机
- 练习 31:正则表达式
- 练习 32:扫描器
- 练习 33:解析器
- 练习 34:分析器
- 练习 35:解释器
- 练习 36:简单的计算器
- 练习 37:小型 BASIC
- 第六部分:SQL 和对象关系映射
- 练习 38:SQL 简介
- 练习 39:SQL 创建
- 练习 40:SQL 读取
- 练习 41:SQL 更新
- 练习 42:SQL 删除
- 练习 43:SQL 管理
- 练习 44:使用 Python 的数据库 API
- 练习 45:创建 ORM
- 第七部分:大作业
- 练习 46:blog
- 练习 47:bc
- 练习 48:ed
- 练习 49:sed
- 练习 50:vi
- 练习 51:lessweb
- 练习 52:moreweb