# 練習 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