Ubuntu下递归查找Windows可执行文件的Python代码无输出问题排查
你猜的完全正确!Linux和Windows对“可执行文件”的识别逻辑根本不是一回事,这就是你的代码没输出的核心原因。我来拆解一下问题,再给你可行的解决方案:
问题根源
扩展名不具备特殊意义:在Windows里,
.exe是系统识别可执行程序的关键标记,但在Linux中,后缀只是文件名的一部分——系统完全不关心你叫.exe还是.txt,判断一个文件是否可执行看的是权限位的x标记,而Win32/Dos的exe文件在Linux下默认是没有这个权限的。你的代码的潜在问题:就算你的文件真的带
.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类型:
- 先安装依赖:
sudo apt install python3-magic # Ubuntu/Debian系 # 或者用pip安装 pip install python-magic - 代码实现:
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

