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

Ubuntu下递归查找Windows可执行文件的Python代码无输出问题排查

为什么你的Windows风格查找exe代码在Linux上失效?

你猜的完全正确!Linux和Windows对“可执行文件”的识别逻辑根本不是一回事,这就是你的代码没输出的核心原因。我来拆解一下问题,再给你可行的解决方案:

问题根源

  1. 扩展名不具备特殊意义:在Windows里,.exe是系统识别可执行程序的关键标记,但在Linux中,后缀只是文件名的一部分——系统完全不关心你叫.exe还是.txt,判断一个文件是否可执行看的是权限位的x标记,而Win32/Dos的exe文件在Linux下默认是没有这个权限的。

  2. 你的代码的潜在问题:就算你的文件真的带.exe后缀,os.chdir(folder)的写法也容易出问题——比如folders里的路径是相对路径,切换目录后glob的搜索范围可能不是你预期的;而且如果Python版本低于3.5,glob.glob("**/*.exe", recursive=True)的**递归语法也不生效。不过从你说Windows下能运行来看,版本应该没问题,但目录切换的坑还是得注意。

正确的解决思路:通过文件头识别Win32/Dos可执行文件

要准确找到这些文件,得靠文件的魔术字节(Magic Bytes)——也就是文件开头的几个特征字节,Win32/Dos的exe文件开头都是MZ(十六进制的4D 5A)。下面给你两种实现方式:

方式1:手动读取文件头(无需额外依赖)

这种方法不用装第三方库,直接读取每个文件的前2个字节来判断:

import os

def find_windows_executables(root_path):
    # Win32/Dos exe的特征开头字节
    EXE_SIGNATURE = b'MZ'
    
    for dirpath, _, filenames in os.walk(root_path):
        for filename in filenames:
            full_path = os.path.join(dirpath, filename)
            try:
                # 只读前2个字节,避免读取大文件浪费资源
                with open(full_path, 'rb') as f:
                    header = f.read(2)
                    if header == EXE_SIGNATURE:
                        print(full_path)
            except (PermissionError, OSError):
                # 跳过无权限或无法读取的文件
                continue

# 替换成你的Documents绝对路径
find_windows_executables('/home/your_username/Documents')

方式2:用python-magic库(更准确)

如果想更精准地识别文件类型,可以用python-magic库,它能识别各种文件的MIME类型:

  1. 先安装依赖:
    sudo apt install python3-magic  # Ubuntu/Debian系
    # 或者用pip安装
    pip install python-magic
    
  2. 代码实现:
    import os
    import magic
    
    

def find_windows_executables(root_path):
# 初始化magic对象,用于识别MIME类型
mime_detector = magic.Magic(mime=True)
# Windows PE格式exe的标准MIME类型
WIN_EXE_MIME = 'application/vnd.microsoft.portable-executable'

for dirpath, _, filenames in os.walk(root_path):
    for filename in filenames:
        full_path = os.path.join(dirpath, filename)
        try:
            file_mime = mime_detector.from_file(full_path)
            if file_mime == WIN_EXE_MIME:
                print(full_path)
        except (PermissionError, OSError):
            continue

find_windows_executables('/home/your_username/Documents')

## 额外提示
- 尽量避免用`os.chdir`来切换目录遍历,用`os.walk`配合绝对路径更可靠,能规避很多路径相关的bug。
- 如果你的文件确实都带`.exe`后缀,也可以把两种判断结合起来(先过滤后缀再检查文件头),提升搜索效率。

内容的提问来源于stack exchange,提问作者Jishan
相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 14:57:38