搜索目录文件

同样是面试时问到的题目,当时要求用 Python ,因为平时对于 Python os 模块很少使用,不熟悉,所以当时没想到怎么查找。但是想到了使用 Linux 命令行,这样会更简单,方法 2 中会给出两种查找方法 。首先使用 Python

  1. 使用 Python

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    #!/bin/python3
    #coding:utf-8
    import os
    import sys
    def 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 os
    import sys
    def 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/' file
    import os
    import sys
    def 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 fp
    break
    elif 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() 获得当前目录。

  1. 使用 shell
1
2
ls -aR | grep filename
find ./ -type f -name 'filename'
赞赏是对作者最大的支持!
0%