MLSD 是 Machine List Standard Directory 的缩写,它是一个现代 FTP 协议中用于列出目录内容的命令。

MLSD 是什么?
MLSD 是一个为机器(程序)而非人类设计的目录列表命令,它的主要特点是:
- 格式固定:输出的格式是标准化的,通常使用
key=value对的形式,每一行代表一个文件或目录。 - 易于解析:由于格式固定,程序(脚本、客户端软件)可以非常容易、可靠地解析输出内容,提取出文件名、大小、修改时间、权限等信息。
- 功能强大:它提供了比传统的
LIST(或LS) 命令更丰富的文件属性信息。
可以把它看作是 FTP 版本的 ls -l 的机器可读版本。
MLSD 与 LIST / NLST 的核心区别
这是理解 MLSD 的关键,我们通过一个对比表格来看:
| 特性 | MLSD (Machine List Standard) |
LIST (或 LS) |
NLST (Name List) |
|---|---|---|---|
| 设计目标 | 机器可读 | 人类可读 | 机器可读(仅文件名) |
| 输出格式 | 标准化,通常是 fact=value 对,用空格分隔。 |
非标准化,格式因 FTP 服务器操作系统而异 (Unix, Windows, VMS 等)。 | 简单,每行一个文件名或目录名。 |
| 可靠性 | 高,程序可以稳定解析。 | 低,程序需要复杂的逻辑来处理不同格式的输出。 | 高,但信息非常有限。 |
| 使用场景 | 自动化脚本、文件同步工具、需要精确获取文件属性的程序。 | 用户手动在命令行交互查看目录内容。 | 快速获取文件列表,例如检查某个文件是否存在。 |
MLSD 的工作原理
- 发送命令:客户端向 FTP 服务器发送
MLSD命令。 - 建立数据连接:服务器会像
LIST命令一样,建立一个数据连接(通常是被动模式PASV)来传输数据。 - 接收数据:服务器通过数据连接将格式化的目录列表信息发送给客户端。
- 关闭连接:数据传输完毕后,数据连接会自动关闭。
MLSD 的输出格式详解
MLSD 的输出是每行一个条目,每个条目由一组或多组 fact=value 组成,最后是文件名。

常见的 fact (属性) 包括:
type: 文件类型。dir表示目录,file表示文件,cdir表示当前目录,pdir表示父目录。size: 文件大小(字节)。modify: 文件最后修改时间,格式通常为YYYYMMDDHHMMSS[+/-]HHMM。perm: 文件权限。a表示允许所有(读、写、执行/进入),r表示只读,w表示可写,f表示可重命名/删除。unique: 文件的唯一标识符(类似于 Unix 的 inode 号)。unix.mode: Unix 权限位(如0755)。unix.owner: Unix 文件所有者 ID。unix.group: Unix 文件所属组 ID。
示例输出:
假设一个目录下有一个名为 report.txt 的文件和一个名为 archive 的子目录,MLSD 的输出可能如下:
type=file;size=1024;modify=20251027103000;perm=r; report.txt
type=dir;size=0;modify=20251020090000;perm=e; archive
如何解析:
- 第一行:描述
report.txt。type=file: 这是一个文件。size=1024: 文件大小为 1024 字节。modify=20251027103000: 最后修改时间是 2025年10月27日 10:30:00。perm=r: 权限是只读。report.txt: 文件名(注意前面有一个空格)。
- 第二行:描述
archive。type=dir: 这是一个目录。size=0: 目录的大小通常为 0。modify=20251020090000: 最后修改时间是 2025年10月20日 09:00:00。perm=e: 权限是允许进入(efor enter)。archive: 目录名。
如何使用 MLSD (在命令行)
在标准的 FTP 客户端(如 Windows 的 ftp.exe 或 Linux/macOS 的 ftp)中,使用 MLSD 非常简单。
# 1. 连接到 FTP 服务器 $ ftp ftp.example.com Connected to ftp.example.com. 220-Welcome to the FTP example server. 220-Please visit our website at http://www.example.com 220 You will be disconnected after 15 minutes of inactivity. Name (ftp.example.com:user): myusername 331 Password required for myusername. Password: 230-User logged in. 230 Access granted. # 2. 进入目标目录 (可选) ftp> cd /path/to/your/directory 250 Directory successfully changed. # 3. 发送 MLSD 命令 ftp> mlsd 200 Command okay. 150 Opening data connection for MLSD. # 4. 查看服务器返回的机器可读格式列表 type=file;size=1024;modify=20251027103000;perm=r; report.txt type=dir;size=0;modify=20251020090000;perm=e; archive 226 Transfer complete. ftp: 32 bytes received in 0.00Seconds 32.00Kbytes/sec. # 5. 退出 FTP ftp> bye 221 Goodbye.
重要注意事项
- 服务器支持:
MLSD是在 RFC 3659 中定义的相对较新的标准,非常老旧的 FTP 服务器可能不支持此命令,如果服务器不支持,它会返回500 'MLSD': command not recognized这样的错误。 - 数据连接:和
LIST一样,MLSD依赖于一个独立的数据连接来传输数据,如果防火墙或网络配置有问题,数据连接可能会失败。 - 与
MLST的区别:还有一个相关的命令叫MLST(Machine List)。MLSD列出当前目录下的所有内容,而MLST只列出单个文件或目录的详细信息,并且其输出通常以状态行开头,以文件名结尾。MLST常用于在操作前检查一个特定文件的属性。
MLSD 是现代 FTP 自动化任务中首选的目录列表命令,它为程序提供了可靠、标准化的方式来获取文件系统信息,避免了传统 LIST 命令因平台差异带来的解析难题,如果你正在编写任何与 FTP 交互的脚本或程序,都应该优先使用 MLSD 来获取目录内容。

