You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux下如何递归遍历/var目录且仅访问同一文件系统内容?

仅遍历同一文件系统的递归实现

要在Linux下递归遍历/var时跳过不同文件系统的目录(比如/var/tmp),核心思路是通过设备ID判断目录是否属于同一文件系统——同一文件系统内的文件/目录,stat()返回的st_dev字段值一致。

直接用pathlib.Path.rglob()无法做到这点,因为它会无条件递归所有子目录。我们可以结合os.walk和设备ID判断来实现需求:

实现代码

from pathlib import Path
import os

def rglob_same_fs(root: Path):
    # 获取根目录的设备ID
    root_dev = root.stat().st_dev
    # 遍历目录,topdown=True时可修改dirs列表跳过指定目录
    for root_path, dirs, files in os.walk(root, topdown=True):
        root_path = Path(root_path)
        # 生成当前目录本身
        yield root_path
        # 生成当前目录下的所有文件
        for file in files:
            yield root_path / file
        # 过滤掉不同文件系统的目录,避免递归进入
        dirs[:] = [d for d in dirs if (root_path / d).stat().st_dev == root_dev]

# 使用示例:遍历/var下同一文件系统的所有内容
for path in rglob_same_fs(Path("/var")):
    print(path)

关键逻辑说明

  1. 获取设备ID:root.stat().st_dev拿到/var所在文件系统的设备标识,后续所有目录都和这个值对比。
  2. 过滤目录:在os.walk遍历过程中,修改dirs列表(用dirs[:]直接修改原列表),只保留和根目录设备ID一致的子目录,这样os.walk就不会递归进入不同文件系统的目录(比如/var/tmp)。
  3. 生成路径:同时返回目录和文件,和rglob('**')的行为保持一致。

如果不需要返回目录本身,只需要文件的话,去掉yield root_path这一行即可。

内容的提问来源于stack exchange,提问作者pepoluan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 16:42:19