同样是面试时问到的题目,当时要求用 Python
,因为平时对于 Python os
模块很少使用,不熟悉,所以当时没想到怎么查找。但是想到了使用 Linux
命令行,这样会更简单,方法 2
中会给出两种查找方法 。首先使用 Python
。
使用
Python
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556#!/bin/python3#coding:utf-8import osimport sysdef findfile(start,name):for path,dirs,files in os.walk(start):if name in files:#print(path)#print(dirs)#print(files)full_path = os.path.join(start,path,name)print(os.path.normpath(os.path.abspath(full_path)))if __name__ == '__main__':#findfile('/home','ip')findfile(sys.argv[1],sys.argv[2])import osimport sysdef findfile(path,name):for filename in os.listdir(path):fullpath = os.path.join(path,filename)#判断是否为文件。如果为目录,则继续遍历if os.path.isfile(fullpath) and name in filename:print(fullpath)#为目录,继续遍历elif os.path.isdir(fullpath):findfile(fullpath,name)if __name__ == '__main__':if len(sys.argv)!=3:print('{} need 2 arguments'.formate(sys.argv[0]))findfile(sys.argv[1],sys.argv[2])#查找内容含有关键字的文件#shell: cat file | grep keywords#awk '/keywords/' fileimport osimport sysdef search(path, word):for filename in os.listdir(path):fp = os.path.join(path, filename)if os.path.isfile(fp):with open(fp) as f:for line in f:if word in line:print fpbreakelif os.path.isdir(fp):search(fp, word)search(sys.argv[1], sys.argv[2])
start
为需要遍历的顶级目录,name
为要查找的文件名。os.walk()
方法每进入一个目录,会返回一个三元组,分别为:相对于查找目录(即传入的顶级目录)的相对路径,该目录下的目录名列表,以及那个目录下面的文件名列表。通常我们只需要第一个和第三个参数,因此可以改写为 for path,_,files in os.walk(start)
。
对于每个元组,只需检测目标文件名是否在文件列表中。如果是就使用 os.path.join()
合并路径。 因为合并的是相对路径,所以会包含 ././foo
这种路径,所以需要另外两个函数来修正结果。 第一个os.path.abspath()
,它接受一个路径,返回绝对路径。 第二个是 os.path.normpath()
,用来返回正常路径,可以解决双斜杆、对目录的多重引用的问题等。
os
模块其他常用的方法有:os.path.exists(path)
,判断路径是否存在。 os.listdir(path)
获得 一个目录下的所有文件或者子目录。os.path.isfile(path)
判断是否为文件。os.getcwd()
获得当前目录。
- 使用
shell
|
|