对一个运维来说可能会经常去查找目录下的一些文件是否存在,最常用的就是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')