Linux dir 命令超详细详解
dir是 Linux 系统中与ls功能几乎完全一致的目录列表命令,最初是为了兼容 DOS/Windows 用户的使用习惯而设计。在 GNU/Linux 系统中,dir与ls、vdir是同一个二进制文件的不同硬链接,共享 99% 以上的参数和功能,仅在默认输出行为上存在细微差异。
⚠️ 核心结论:绝大多数情况下,
dir可以完全替代ls,反之亦然。了解两者的差异主要是为了避免踩坑和适应不同的使用习惯。
一、核心定位与实现原理
核心定位
- POSIX 标准定义的目录列表命令,行为更规范、更可预测
- 专为习惯 DOS/Windows
dir命令的用户设计 - 输出更适合脚本处理,默认转义特殊字符
- 与
ls完全兼容,所有ls的参数都可以直接用于dir
实现原理
在 GNU coreutils 中,dir、ls、vdir是同一个程序的三个不同入口:
bash
运行
# 查看三个命令的 inode 号(完全相同) ls -i /bin/ls /bin/dir /bin/vdir # 输出示例:123456 /bin/dir 123456 /bin/ls 123456 /bin/vdir程序通过判断argv[0](命令名)来决定默认行为:
ls:默认多列显示,不转义特殊字符,终端输出时启用颜色dir:默认多列显示,强制转义特殊字符,默认不启用颜色vdir:默认长格式显示,相当于dir -l
二、基础语法与默认行为
基础语法
bash
运行
dir [选项] [目录/文件路径]- 选项:与
ls完全相同,所有ls的参数都可以直接使用 - 目录 / 文件路径:要列出的目录或文件,默认为当前目录(
.)
默认行为(与ls的核心差异)
表格
| 行为 | dir | ls |
|---|---|---|
| 显示格式 | 始终多列显示(无论输出到终端还是文件) | 终端输出多列,管道 / 文件输出单列 |
| 特殊字符 | 默认转义所有不可打印字符(-b) | 默认直接显示不可打印字符(可能导致终端乱码) |
| 颜色输出 | 默认不启用颜色 | 终端输出时默认启用颜色 |
| 隐藏文件 | 默认不显示 | 默认不显示 |
| 排序方式 | 按文件名升序 | 按文件名升序 |
简单来说:
dir等价于ls -C -b --color=never
三、核心常用参数
由于dir与ls参数完全兼容,这里只列出最常用的参数,完整参数请参考ls命令详解。
1. 基础显示控制
表格
| 参数 | 含义 |
|---|---|
-a/--all | 显示所有文件,包括隐藏文件和.、.. |
-A/--almost-all | 显示所有隐藏文件,但不显示.和.. |
-l | 以长格式显示详细信息(权限、所有者、大小、时间等) |
-h/--human-readable | 以人类可读格式显示文件大小(KB、MB、GB) |
-1(数字 1) | 每行只显示一个文件 |
-m | 以逗号分隔格式显示文件名 |
2. 排序控制
表格
| 参数 | 含义 |
|---|---|
-t | 按修改时间降序排列(最新的在前) |
-S | 按文件大小降序排列(最大的在前) |
-r/--reverse | 反转排序顺序 |
-v | 按版本号自然排序 |
-X | 按文件扩展名排序 |
3. 时间与详细信息
表格
| 参数 | 含义 |
|---|---|
-i/--inode | 显示文件的 inode 号 |
-c | 显示状态改变时间(ctime)并按其排序 |
-u | 显示访问时间(atime)并按其排序 |
--full-time | 显示完整的时间戳(精确到纳秒) |
4. 目录与类型
表格
| 参数 | 含义 |
|---|---|
-d/--directory | 只显示目录本身,不显示目录内容 |
-R/--recursive | 递归列出所有子目录的内容 |
-F/--classify | 在文件名后添加类型标识符号 |
--color=auto | 启用彩色输出(与ls相同的颜色规则) |
四、dir vs ls 全面对比
表格
| 特性 | dir | ls |
|---|---|---|
| 设计初衷 | 兼容 DOS/Windows 习惯 | Unix 原生目录列表命令 |
| 默认输出 | ls -C -b --color=never | 终端:ls -C --color=auto;管道 / 文件:ls -1 |
| 特殊字符处理 | 默认转义,输出安全 | 默认直接显示,可能乱码 |
| 颜色输出 | 默认关闭 | 终端默认开启 |
| 输出一致性 | 无论输出到哪里都是多列 | 输出到终端多列,管道 / 文件单列 |
| 别名支持 | 系统通常不预定义别名 | 系统通常预定义ll、la等别名 |
| 脚本适用性 | 更适合脚本(输出更可预测) | 更适合日常交互使用 |
| 跨平台兼容性 | POSIX 标准,行为更统一 | 不同 Unix 变体行为略有差异 |
五、高频实战示例
1. 基本使用(与 ls 完全一致)
bash
运行
# 列出当前目录非隐藏文件 dir # 列出所有文件(包括隐藏) dir -a # 长格式显示详细信息 dir -l # 长格式+人类可读大小 dir -lh2. 启用彩色输出(最常用)
由于dir默认没有颜色,建议在别名中添加--color=auto:
bash
运行
# 临时启用颜色 dir --color=auto # 永久设置别名(添加到 ~/.bashrc) echo "alias dir='dir --color=auto'" >> ~/.bashrc source ~/.bashrc3. 按时间和大小排序
bash
运行
# 按修改时间降序(最新的在前) dir -lt # 按修改时间升序(最旧的在前) dir -ltr # 按文件大小降序(最大的在前) dir -lhS # 按文件大小升序(最小的在前) dir -lhSr4. 只显示目录本身
bash
运行
# 查看 /var 目录的权限和属性 dir -ld /var # 只显示当前目录下的所有子目录 dir -d */5. 处理含特殊字符的文件名(dir 的优势)
dir默认转义特殊字符,输出更安全,不会被 shell 误解析:
bash
运行
# 创建一个含空格和换行的文件 touch "file with spaces"$'\n'"and newline" # ls 的输出(可能导致终端乱码,无法直接复制) ls # 输出:file with spaces?and newline # dir 的输出(安全转义,可以直接复制使用) dir # 输出:'file with spaces'$'\n''and newline'6. 递归列出所有文件
bash
运行
# 递归列出当前目录及其所有子目录 dir -R # 递归显示所有文件的详细信息 dir -lR六、相关命令:vdir
vdir是dir的另一个变体,默认以长格式显示,相当于dir -l:
bash
运行
# 以下两个命令完全等价 vdir dir -lvdir同样与ls完全兼容,所有参数都可以直接使用。
七、避坑重点与最佳实践
避坑重点
默认没有颜色这是
dir最容易被吐槽的地方,建议在~/.bashrc中添加别名启用颜色:bash
运行
alias dir='dir --color=auto' alias vdir='vdir --color=auto'输出始终多列当
dir的输出通过管道传递给其他命令时,仍然是多列格式,可能导致解析错误。如果需要单列输出,必须显式加-1参数:bash
运行
# 错误:多列输出无法正确统计行数 dir | wc -l # 正确:强制单列输出 dir -1 | wc -l没有预定义别名系统通常不会为
dir预定义ll、la等别名,需要手动添加:bash
运行
alias dl='dir -l' alias dla='dir -la' alias dlt='dir -lht'
最佳实践
日常交互优先使用 ls
ls有默认颜色输出和丰富的预定义别名,使用体验更好。脚本中优先使用 dir
dir的输出更可预测,默认转义特殊字符,处理含空格、换行等特殊字符的文件名更安全。处理特殊文件名时使用 dir当目录中存在大量含特殊字符的文件时,
dir的输出比ls更清晰、更安全。跨平台脚本使用 dir
dir是 POSIX 标准命令,在不同 Unix 变体上的行为更统一,而ls的某些参数是 GNU 扩展。
八、常用组合速查表
表格
| 命令组合 | 含义 |
|---|---|
dir | 列出当前目录非隐藏文件(多列,转义特殊字符) |
dir -a | 列出所有文件(包括隐藏) |
dir -l | 长格式显示非隐藏文件 |
dir -lh | 长格式显示,人类可读大小 |
dir -lt | 按修改时间降序排列 |
dir -lS | 按文件大小降序排列 |
dir -ld /dir | 查看目录本身的详细信息 |
dir -1 | 强制单列输出(适合脚本) |
dir --color=auto | 启用彩色输出 |