如何用python寫一個簡單的find命
- 2020 年 1 月 10 日
- 筆記
對一個運維來說可能會經常去查找目錄下的一些文件是否存在,最常用的就是find命令,它不僅可以查找文件也可以查找目錄,find命令用法
查找文件
[root@node1 opt]# find /usr/ -type f -name df
/usr/bin/df
查找目錄
[root@node1 opt]# find /usr/ -type d -name python
/usr/share/gcc-4.8.2/python
現在就講一些如何用python實現這個簡單功能,這裡先將一下python os.walk函數的用法
首先 通過walk函數獲取指定目錄下的所有文件和目錄,walk默認返回一個列表裡面分別是
(「父目錄」,「當前目錄下的目錄」,當前目錄下的文件)下面實例:
[root@-node1 tmp]# mkdir -p /tmp/project/code/ [root@-node1 tmp]# mkdir -p /tmp/project/docs [root@-node1 tmp]# touch /tmp/project/docs/readme.md In [23]: import os In [24]: res=os.wa os.wait os.wait3 os.wait4 os.waitpid os.walk In [24]: res=os.walk('/tmp/project') In [25]: print res <generator object walk at 0x28989b0> In [26]: for i in res: ....: print i ....: ('/tmp/project', ['code', 'docs'], []) ('/tmp/project/code', [], []) ('/tmp/project/docs', [], ['readme.md'])
現在來實現一個文件查找函數把
首先大家查找文件有兩種情況:知道完整文件名,知道文件名部分。
在這個函數裡面需要你輸入兩個必要參數就是查找文件的目錄,查找文件名,剩下一個非必要參數是否使用模糊搜索(在不知道全部文件名的時候會用到)。
下面的邏輯是使用os.walk獲取到指定目錄下的tree資訊,如果當前目錄下的文件有名字與輸入名字相同的請輸出文件路徑和名稱
[root@node1 opt]# cat pro1.py def find_f(dir,word,use_like=False): res=os.walk(dir) for tree_list in res: for file_name in tree_list[2]: if use_like == False: if word == file_name: print "{path}/{file}".format(path=tree_list[0],file=file_name) else: if word in file_name: print "{path}/{file}".format(path=tree_list[0],file=file_name) find_f("/usr","ls") [root@node1 opt]# python pro1.py /usr/bin/ls
當然你也可以同樣使用這個邏輯查找目錄
def find_d(dir,word,use_like=False): res=os.walk(dir) for tree_list in res: for dir_name in tree_list[1]: if use_like == False: if word == dir_name: print "{path}/{dir}".format(path=tree_list[0],dir=dir_name) else: if word in dir_name: print "{path}/{dir}".format(path=tree_list[0],dir=dir_name) find_d("/usr/","python")
現在你可以感覺寫兩段程式碼有點麻煩,想要精簡一下,這樣就實現了簡單的find功能
def find(dir,word,type='f',use_like=False): res=os.walk(dir) for tree_list in res: if type == "f": mt=2 elif type == "d": mt=1 else: print "This type %s is noexist" % type for name in tree_list[mt]: if use_like == False: if word == name: print "{path}/{name}".format(path=tree_list[0],name=name) else: if word in name: print "{path}/{name}".format(path=tree_list[0],name=name) find('/usr','ls')