ltts blog

每天深入一个学习linux命令系列 - Day 1: ls 命令深度解析

功能分类

文件与目录管理命令定位:列出目录内容,是文件系统操作的基础工具。

核心语法

ls [选项] [文件/目录...]

常用选项详解

选项功能描述场景示例
-l长格式显示(权限/所有者/大小/时间)ls -l /var/log → 查看日志目录详细信息
-a显示隐藏文件(以.开头的文件)ls -a ~ → 查看家目录全部文件(含.config等)
-h人类可读的文件大小(自动转换单位)ls -lh → 显示KB/MB/GB而非字节数
-t按修改时间排序(最近修改在前)ls -lt → 快速定位最新变动文件
-r反向排序(配合-t/-S使用)ls -ltr → 旧文件在前查看历史记录
-S按文件大小降序排列ls -lS → 快速找到大文件
-R递归列出子目录内容ls -R /etc → 展示/etc及其所有子目录结构
--color彩色输出(默认启用)ls --color=auto → 区分文件类型(目录/压缩包等)
-i显示inode编号ls -i → 排查硬链接或文件系统问题

高级用法

组合技巧

# 查找当前目录最大的5个文件
ls -lSh | head -n 6  # -S排序后取前5(含标题行)
 
# 显示文件的UID/GID而非用户名/组名
ls -lhn  # -n选项

通配符过滤

ls *.txt          # 所有txt文件
ls [abc]*.log     # 以a/b/c开头的log文件
ls ?.sh           # 单字符命名的sh脚本

时间筛选

# 查找24小时内修改过的文件
ls -lt --time-style=+%s | awk -v limit=$(date -d '24 hours ago' +%s) '$6 > limit'

ls 命令实战案例集

案例 1:快速定位最新修改的文件

场景:开发调试时突然出现异常,需要检查最近修改的配置文件

ls -lt /etc/nginx/conf.d/ | head -n 5
 
# 输出
-rw-r--r-- 1 root root 1012 Aug 25 14:32 default.conf  
-rw-r--r-- 1 root root 3041 Aug 24 09:15 ssl.conf  
 
# 关键点:
# -t 按时间倒序,head -n 5 显示前5个文件
# 可配合 grep 进一步过滤:ls -lt | grep '.conf$'

案例 2:精准统计目录文件数量

场景:清理下载目录前确认文件总数

ls -1 ~/Downloads | wc -l
 
输出:47
 
# 技术细节:
# -1 强制单列输出(避免终端自动分列导致统计错误)
# wc -l 统计行数时包含隐藏文件需加 -a 选项

案例 3:安全审计 - 查找危险权限文件

场景:检查系统中所有用户可写的敏感文件

ls -l /usr/local/bin | grep '^...w..w..w'
 
# 输出示例:
-rwxrwxrwx 1 root root 2048 Aug 20 script.sh
 
# 解析:
# grep 匹配权限中的三个w表示全局可写
# 发现此类文件需用 chmod o-w 移除其他用户写权限
 

案例 4:磁盘空间告急排查

场景:/var 分区使用率超过90%,需快速定位大文件

ls -lSh /var/log | head -n 10
 
# 输出示例:
-rw-r----- 1 syslog adm  2.1G Aug 25 syslog.1  
-rw-r--r-- 1 root   root 893M Aug 24 kern.log
 
# 技巧扩展:
# 组合 du -sh * | sort -h 可获取目录大小
# 但 ls -Sh 速度更快,适合快速初步筛查

案例 5:多条件复合搜索

场景:查找当前目录下大于100MB且修改时间在30天内的.log文件

ls -lht *.log | awk '$5 ~ /M$/ && $5+0 > 100 {print}'
 
# 技术拆解:
# -h 使大小显示为人类可读格式(如100M)
# awk 检查第5列: 
# $5 ~ /M$/ 过滤以MB为单位的文件
# $5+0 > 100 提取数值部分进行大小比较

案例 6:文件类型识别

场景:检查备份目录中是否有符号链接文件

ls -l /backups | grep '^lrwx'
 
# 输出示例:
lrwxrwxrwx 1 root root 12 Aug 20 config -> /etc/app/config
 
# 扩展知识:
# 首字母含义:-=普通文件, d=目录, l=软链接
# 查找所有目录:ls -l | grep '^d'

案例 5:批量操作预处理

场景:删除 /tmp 中所有7天前的 .tmp 文件

ls -l --time-style=+%s /tmp/*.tmp | awk '$6 < '"$(date -d '7 days ago' +%s)"' {print $7}' | xargs rm -v
 
# 安全要点:
# 先运行去掉 | xargs rm 部分确认文件列表
# --time-style=+%s 将时间转为Unix时间戳便于计算
# awk 比较时间戳后输出第7列(文件名)

综合技巧总结

危险操作前验证:

# 在 | xargs rm 前先用 echo 或直接运行 ls 查看目标文件 
ls -t *.bak | head -n 5  # 确认要删除的文件
ls -t *.bak | head -n 5 | xargs rm  # 实际删除

跨目录对比:

# 快速对比两个目录差异: 
diff <(ls -1 /dir1) <(ls -1 /dir2)

时间格式控制:(自定义时间显示格式(GNU coreutils特有):)

ls -l --time-style='+%Y-%m-%d %H:%M:%S'

目录