用python脚本实现shell中的find功能

用python的os模块遍历传入的路径,基于遍历的路径判断是否包含有需要查找的关键字

根据os.name判断当前是什么系统   == "nt"为windows   =="posix"为linux系统

使用递归完成目录的遍历

下面是代码

import os

# 定义默认的数据文件路径,根据操作系统环境变量获取用户桌面路径并拼接文件名
datafile = os.path.join(os.environ.get('USERPROFILE'), "Desktop\\datafile.txt") if os.name == "nt" else os.path.join(
    os.environ.get('HOME'), "datafile.txt")

# 根据操作系统类型设置路径分隔符
sep = "/" if os.name == "posix" else "C:\\"

# 用户输入要查找的文件关键字
keywork = input("请输入你要查找的文件命中所包含的关键字:")

# 用户输入要查找的文件可能存放的路径,默认为当前系统根目录
path = input("请输入你要查找的文件可能存放的路径,默认为C:\\或/:")  # ""

# 如果用户没有输入路径,则使用默认的路径分隔符作为路径
path = path if path else sep

# 检查用户输入的是否为一个存在的目录
if not os.path.isdir(path):
    print('你输入的不是一个目录或不存在')
    exit()

# 初始化两个列表,用于存储符合条件的文件路径和所有遍历过的文件路径
# 查找到的文件存放的列表
data_list = []
# 所有查找过程中出现的文件存放的列表
all_list = []

# 递归查找文件的函数


def find_file(path):
    # 切换到指定目录下
    try:
        os.chdir(path=path)  # 切换到用户指定的目录
        # 查看这个目录下所有的文件和子目录
        file_list = os.listdir()  # 获取目录下的文件和子目录列表
        # 如果是POSIX系统并且当前目录是根目录,则排除"proc"和"sys"这两个特殊目录
        if path == "/" and os.name == "posix":
            file_list.remove("proc")
            file_list.remove("sys")
    except PermissionError:
        print(f"无权限查看此目录:{path}")
        return False
    # 遍历目录下的文件和子目录
    for file_name in file_list:
        # 拼接文件或子目录的完整路径
        fn = os.path.join(path, file_name)
        # 如果文件名中包含关键字,则将该文件路径添加到符合条件的文件列表中
        if keywork in file_name:
            data_list.append(fn)
        # 如果是一个子目录,则递归调用find_file函数继续查找
        if os.path.isdir(fn):
            find_file(fn)
        # 将所有遍历过的文件或子目录路径添加到总列表中
        all_list.append(fn)


# 调用递归查找函数,开始查找文件
find_file(path=path)

# 将符合条件的文件路径写入到指定的数据文件中
with open(datafile, 'w', encoding='utf-8') as f:
    for i in data_list:
        f.write(i + '\n')

# 输出查找结果统计信息
text = f'''
查找完毕:
共查找文件 {len(all_list)}个
符合条件   {len(data_list)}个
符合条件的文件已记录在{datafile}文件中
'''
print(text)

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值