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)
关键逻辑说明
- 获取设备ID:
root.stat().st_dev拿到/var所在文件系统的设备标识,后续所有目录都和这个值对比。 - 过滤目录:在
os.walk遍历过程中,修改dirs列表(用dirs[:]直接修改原列表),只保留和根目录设备ID一致的子目录,这样os.walk就不会递归进入不同文件系统的目录(比如/var/tmp)。 - 生成路径:同时返回目录和文件,和
rglob('**')的行为保持一致。
如果不需要返回目录本身,只需要文件的话,去掉yield root_path这一行即可。
内容的提问来源于stack exchange,提问作者pepoluan
相关产品推荐
相关产品推荐

