1.8.1 文件与目录操作命令(ls、cp、mv、rm、mkdir、find)
在日常运维中,文件与目录操作是最频繁的工作之一。本节围绕 ls、cp、mv、rm、mkdir、find 的核心用法、典型场景、排错与练习,帮助快速定位、管理与维护系统文件。
1. ls:查看文件与目录#
命令解释
- -l:显示权限、属主、大小、时间
- -a:包含隐藏文件
- -h:人类可读单位
- -R:递归展示
示例
# 查看 /etc 目录详细信息与隐藏文件
ls -alh /etc
# 仅查看日志目录下最新 20 个文件(按时间倒序)
ls -lt /var/log | head -n 20
排错
- 显示乱码:检查终端 locale,确认 echo $LANG
- 文件看不到:确认是否隐藏文件 ls -a
练习
- 列出 /var/log 下 50M 以上文件的详细信息(提示:结合 find)
2. mkdir:创建目录#
命令解释
- -p:递归创建
- -m:指定权限
示例
# 创建多级目录并设置权限
mkdir -p -m 755 /data/app/logs
# 预期效果:目录不存在时报错消失,权限为 755
ls -ld /data/app/logs
排错
- 报错 “Permission denied”:检查父目录权限 ls -ld /data
- 报错 “File exists”:使用 -p 或确认路径冲突
练习
- 创建 /backup/2025/01 并设置权限 700
3. cp:复制文件与目录#
命令解释
- -r:递归复制目录
- -a:保留权限、时间、软链接(推荐)
- -i:覆盖前提示
示例(配置备份)
# 备份 nginx 配置到备份目录
mkdir -p /backup/nginx
cp -a /etc/nginx/ /backup/nginx/
# 验证权限与软链接是否保留
ls -al /backup/nginx/nginx
排错
- 报错 “omitting directory”:缺少 -r 或 -a
- 覆盖误操作:使用 -i 防止直接覆盖
练习
- 将 /etc/hosts 复制到 /tmp/hosts.bak 并保留时间戳
4. mv:移动与重命名#
命令解释
- 无参数:移动或重命名
- -f:强制覆盖
- -i:覆盖前提示
示例(日志归档)
# 将当前日志目录归档
mkdir -p /data/archive
mv /var/log/myapp /data/archive/myapp_$(date +%F)
# 预期效果:原目录消失,新目录带日期后缀
ls -l /data/archive
排错
- 跨磁盘移动变慢:会退化为“复制+删除”
- 报错 “Device or resource busy”:确认是否被进程占用 lsof +D 目录
练习
- 将 /tmp/test.log 重命名为 /tmp/test.log.1
5. rm:删除文件与目录#
命令解释
- -r:递归删除目录
- -f:强制删除(无提示)
- -i:交互确认
示例(安全删除流程)
# 1) 先确认目标
ls -al /data/tmp
# 2) 交互式删除
rm -ri /data/tmp
# 3) 高危命令仅在确认后执行
# rm -rf /data/tmp
排错
- 报错 “Permission denied”:检查文件权限与属主
- 删除后仍占用空间:文件被进程占用,查看 lsof | grep deleted
练习
- 删除 /tmp 下 7 天前的 *.tmp 文件(先 dry-run)
6. find:查找文件#
命令解释
- -name:按名称
- -size:按大小
- -mtime:按修改时间
- -perm:按权限
- -exec:对结果执行命令
示例(查找+清理)
# 1) 先查看 7 天前日志(dry-run)
find /var/log -name "*.log" -mtime +7
# 2) 再执行删除
find /var/log -name "*.log" -mtime +7 -exec rm -f {} \;
# 3) 查找大于 100M 的文件
find /data -size +100M -type f -print
排错
- 结果为空:检查路径、大小单位、权限
- 速度慢:限制深度 -maxdepth,或指定类型 -type f
练习
- 查找 /etc 下权限为 644 的文件并输出到 /tmp/perm_644.txt
7. 综合实战:批量备份与清理#
目标:备份配置目录并清理过期日志
# 1) 创建备份目录
mkdir -p /backup/etc_$(date +%F)
# 2) 备份 /etc
cp -a /etc/ /backup/etc_$(date +%F)/
# 3) 清理 30 天前的 *.gz 日志(先预览)
find /var/log -name "*.gz" -mtime +30
# 4) 确认后删除
find /var/log -name "*.gz" -mtime +30 -delete
预期效果
- /backup 下生成带日期的备份目录
- 30 天前的压缩日志被清理
8. 常见故障排查清单#
- 路径不存在:先
ls验证,再mkdir -p - 权限不足:
ls -ld 目录,必要时用sudo - 误删恢复困难:生产环境谨慎使用
rm -rf,建议先备份
9. 练习题#
- 找出 /var/log 中大于 200M 的文件并按大小排序展示前 5 个。
- 将 /etc/nginx 复制到 /backup/nginx 并保留权限与软链接。
- 删除 /tmp 中 14 天前的目录(先预览再执行删除)。