文件与目录管理-touch 📁 — 创建文件或更新时间戳

作用

touch 用于创建空白新文件(若文件不存在),或更新已有文件的访问时间和修改时间为当前时间。

语法

1
touch [选项] 文件...

用法

touch 最常用于快速创建空文件,如占位文件、锁文件、日志文件。也用于触发构建系统重新编译(更新修改时间戳)。-a 只修改访问时间,-m 只修改内容时间,-t 指定具体时间而非当前时间,-r 参考文件 将时间设为与参考文件相同。

常用参数

参数 说明
-a 只修改访问时间
-m 只修改修改时间
-c 不创建文件(仅更新时间)
-t 时间 使用指定时间
-r 参考文件 使用参考文件的时间
-d 字符串 解析字符串为时间

示例

1
2
3
4
5
6
touch FILE.TXT                      # 创建空文件(已存在则更新时间戳)
touch FILE1 FILE2 FILE3 # 批量创建多个文件
touch -a FILE.TXT # 仅修改访问时间
touch -d "2026-01-01 12:00" FILE.TXT # 修改为指定时间
touch -r REFERENCE.TXT TARGET.TXT # 用参考文件的时间戳
touch /var/lock/APP.LOCK # 创建锁文件占位

来源:菜鸟教程

📖 课程位置

本命令在以下课程中讲解:Day 2:文件与目录操作 | Day 5:本周串联实操

文件与目录管理-tree 📁 — 树形显示目录结构

作用

tree 以树状图形式递归显示目录层级结构,比 ls -R 更直观易读,常用于文档说明和项目结构展示。

语法

1
tree [选项] [路径]

用法

tree 默认递归显示当前目录所有文件和子目录。-d 只显示目录,-h 显示文件大小,-L N 限制显示深度,-a 显示隐藏文件,-P 模式 只显示匹配的文件。tree -L 1 只显示第一层。

常用参数

参数 说明
-L N 限制显示深度
-a 显示隐藏文件
-d 只显示目录
-F 文件类型标识(/ 目录、* 可执行等)
-h 以人类可读格式显示大小
-P 模式 只显示匹配的文件
-I 模式 排除匹配的文件
-o 文件 输出到文件
--dirsfirst 目录排在前面

示例

1
2
3
4
5
6
7
8
tree                          # 树形显示当前目录结构
tree -L 2 # 限制显示深度为 2 层
tree -a # 显示隐藏文件
tree -d # 只显示目录
tree -h # 以人类可读格式显示文件大小
tree -L 1 -d # 只显示第一层目录
tree -P "*.sh" # 只匹配 .sh 文件
tree -I "node_modules" # 排除 node_modules 目录

来源:菜鸟教程

文件与目录管理-cd 📁 — 切换工作目录

作用

cd(change directory)是 Shell 内置命令,用于切换当前工作目录。支持绝对路径、相对路径、快捷符号,是终端操作中最基础的导航命令。

语法

1
cd [目录路径]

用法

cd 无参数时回到当前用户主目录 $HOMEcd - 返回上一个目录,cd ~ 回家目录,cd .. 返回上级,cd ../.. 上两级。路径支持 Tab 键自动补全。注意:cd 是 Shell 内置命令,没有独立可执行文件,仅影响当前 Shell 环境。

常用参数

参数 说明
(无) 切换到当前用户主目录
- 切换到上一个目录
~ 切换到当前用户主目录
~用户名 切换到指定用户的主目录
-P 切换到物理路径(绕过符号链接)
-L 跟随符号链接(默认)

示例

1
2
3
4
5
6
7
8
cd                     # 回到当前用户主目录
cd /var/log # 切换到绝对路径
cd .. # 返回上级目录
cd - # 返回上一个目录
cd ~ # 回到主目录(等价于无参数)
cd ~JOHN # 切换到用户 JOHN 的主目录
cd $PROJECT_DIR # 使用变量中的路径
cd ../.. # 返回上两级目录

来源:菜鸟教程

📖 课程位置

本命令在以下课程中讲解:Day 1:路径与目录切换 | Day 5:本周串联实操

文件与目录管理-cp 📁 — 复制文件或目录

作用

cp(copy)用于将源文件或目录复制到目标位置,可保留文件属性(权限、时间戳),支持递归复制目录和创建链接。

语法

1
2
cp [选项] 源文件 目标文件
cp [选项] 源文件... 目标目录

用法

cp 的两个操作数形式分别为”源到目标”和”多个源到目录”。复制目录必须加 -R-i 在覆盖前提示确认,-p 保留源文件属性,-a 归档模式等价于 -dR --preserve=all-u 仅在源文件更新时复制。默认若目标存在则直接覆盖(部分发行版通过别名设置了 -i)。

常用参数

参数 说明
-R 递归复制目录
-i 覆盖前提示确认
-f 强制覆盖不提示
-p 保留文件属性
-a 归档模式(保留属性 + 递归)
-u 源文件更新时才复制
-v 显示复制过程
-b 覆盖前备份
-s 创建符号链接而非复制

示例

1
2
3
4
5
6
cp FILE1.TXT FILE2.TXT      # 复制并重命名
cp -r DIR/ /TARGET/ # 递归复制整个目录
cp -i FILE.TXT /TARGET/ # 覆盖前提示确认
cp -p FILE.TXT /TARGET/ # 保留权限和时间戳
cp -a DIR1 DIR2 # 归档模式复制目录
cp -v *.LOG /BACKUP/ # 显示复制过程

来源:菜鸟教程

📖 课程位置

本命令在以下课程中讲解:Day 2:文件与目录操作 | Day 5:本周串联实操

文件与目录管理-df 📁 — 查看磁盘空间使用情况

作用

df(disk free)报告文件系统的总容量、已用空间、可用空间和使用率,是排查磁盘空间不足的首选命令。

语法

1
df [选项] [挂载点]

用法

df 显示各挂载点的磁盘使用统计。-h 以 K/M/G 人类可读格式显示,-T 显示文件系统类型,-i 显示 inode 使用情况而非块使用。--total 汇总所有。排查磁盘满时运行 df -h 即可快速定位哪个分区满了。

常用参数

参数 说明
-h 人类可读格式(K/M/G)
-T 显示文件系统类型
-a 显示所有文件系统
-i 显示 inode 信息
-x 类型 排除指定文件系统
--total 汇总显示总计
--sync 同步后再读取

示例

1
2
3
4
5
6
df -h                    # 人类可读格式显示磁盘使用
df -hT # 显示磁盘使用及文件系统类型
df -hi # 查看 inode 使用情况
df -h --total # 显示总计行
df -h /home # 只看 /home 分区的使用
df -hTx TMPFS # 排除 tmpfs 类型

来源:菜鸟教程

📖 课程位置

本命令在以下课程中讲解:Day 3:系统资源监控 | Day 5:本周串联实操

文件与目录管理-du 📁 — 统计文件/目录的磁盘使用量

作用

du(disk usage)递归统计文件或目录占用的磁盘空间,用于查找大文件和大目录。

语法

1
du [选项] [路径]

用法

du 递归计算每个子目录的大小。-h 人类可读格式,-s 汇总总计,-d N 限制递归深度。查找大文件时配合 sort -h 使用:du -sh | sort -h--exclude 排除指定模式。-t 阈值 只显示超过指定大小的目录。

常用参数

参数 说明
-h 人类可读格式
-s 汇总总计
-d N 限制递归深度
-c 汇总总计
--exclude=模式 排除匹配的文件
-t 大小 只显示超过指定大小
-a 显示所有文件
--time 显示最后修改时间

示例

1
2
3
4
5
6
du -sh                         # 统计当前目录各子目录大小
du -sh --exclude="*.LOG" # 排除 .log 文件后统计
du -d 1 # 只统计第一层目录
du -sh /home # 统计 /home 目录
du -sh | sort -h # 排序找出最大目录
du -sh --time # 显示最后修改时间

来源:菜鸟教程

📖 课程位置

本命令在以下课程中讲解:Day 3:系统资源监控 | Day 5:本周串联实操

文件与目录管理-file 📁 — 探测文件类型

作用

file 通过检查文件头部魔数(magic number)来判断文件真实类型,不依赖扩展名,适合确认未知文件的格式。

语法

1
file [选项] 文件...

用法

file 读取文件头部的特征字节与 magic 数据库对比,输出格式如 “ASCII text”、”ELF 64-bit LSB executable”、”gzip compressed data”。-b 简洁输出(不显示文件名),-i 显示 MIME 类型,-s 查看设备文件或特殊文件,-z 查看压缩文件内部类型。

常用参数

参数 说明
-b 简洁输出(不显示文件名)
-i 显示 MIME 类型
-s 查看特殊文件
-z 查看压缩文件内部
-m 文件 指定 magic 文件
-k 持续检测(不遇错即停)

示例

1
2
3
4
5
file FILE.TXT                    # 判断文件真实类型
file -b /bin/ls # 简洁输出,不显示文件名
file -i FILE.JPG # 显示 MIME 类型
file -z ARCHIVE.TAR.GZ # 查看压缩文件内部类型
file * /usr/bin/* # 批量探测多个文件

来源:菜鸟教程

文件与目录管理-find 📁 — 查找文件和目录

作用

find 在指定路径下递归搜索文件和目录,支持按名称、类型、大小、时间、权限等多维条件组合过滤,并可对结果执行自定义操作(删除、复制、执行命令等)。

语法

1
find [路径] [条件] [动作]

用法

find 从指定路径向下递归遍历。-name 按文件名匹配(支持通配符),-iname 忽略大小写;-type f/d/l 过滤文件/目录/链接;-size +100M 按大小筛选;-mtime -7 查找 7 天内修改的文件。-exec 命令 {} \; 对结果执行操作。逻辑运算:-a(与)、-o(或)、!(非)。

常用参数

参数 说明
-name 按文件名匹配
-iname 忽略大小写匹配
-type f/d/l 文件/目录/链接
-size +100M 按大小过滤
-mtime +7 按修改时间(天)
-mmin -60 按修改时间(分钟)
-perm 644 按权限匹配
-user 按所有者
-empty 空文件/目录
-maxdepth N 最大搜索深度
-exec CMD {} \; 对结果执行命令
-ok 交互式确认执行

示例

1
2
3
4
5
6
find /etc -name "*.conf"          # 查找 /etc 下所有 .conf 文件
find . -type f -size +100M # 查找当前目录下超过 100MB 的文件
find /tmp -mtime +7 -exec rm {} \; # 查找 7 天前的文件并删除
find . -name "*.LOG" | xargs rm -f # 配合 xargs 删除所有 .log 文件
find . -type d -empty -delete # 删除所有空目录
find . -name "*.TXT" -a -size -10K # 查找 .txt 且小于 10KB 的文件

来源:菜鸟教程

Day 4:定时任务 crontab

今日目标:会设置、查看、删除定时任务——让机器在指定时间自动执行你的脚本 🎯

命令速览

命令 用途
crontab -e 编辑当前用户的定时任务
crontab -l 查看当前用户的定时任务
crontab -r 删除当前用户的所有定时任务

逐个击破

① crontab 时间格式

格式分 时 日 月 周 命令

位置 含义 取值范围
第 1 位 分钟 0-59
第 2 位 小时 0-23
第 3 位 1-31
第 4 位 1-12
第 5 位 星期 0-7(0 和 7 都表示周日)

特殊符号

  • *→ 每个时间单位
  • */N→ 每隔 N 个单位
  • N,M,K→ 枚举(第 N、M、K 个单位)
  • N-M→ 范围(N 到 M)

常见示例

表达式 含义
*/5 * * * * 每 5 分钟
0 * * * * 每小时整点
0 2 * * * 每天凌晨 2:00
30 8 * * 1-5 工作日 8:30
0 0 1 * * 每月 1 号 0:00
0 0 * * 0 每周日 0:00
@reboot 系统启动时(部分系统支持)

② crontab 操作

  • 上手练 🖥️

    1. 查看crontab -l——看看当前用户有没有定时任务

    2. 编辑crontab -e——打开编辑器,添加以下行:

      1
      2
      # 每 2 分钟向文件写入一条记录
      */2 * * * * echo "$(date): cron test" >> /tmp/cron-test.log

      保存退出后,等 2 分钟检查 /tmp/cron-test.log

      1
      cat /tmp/cron-test.log
    3. 验证生效

      1
      tail -f /tmp/cron-test.log  # 等待 cron 写入
    4. 删除:先查看再删除

      1
      2
      3
      crontab -l > /tmp/cron-backup.txt  # 备份
      crontab -r # 删除所有
      crontab -l # 确认已删除
    5. 恢复crontab /tmp/cron-backup.txt——从文件恢复定时任务

    6. 以其他用户身份操作sudo crontab -u username -l——查看指定用户的 crontab

  • ⚠️ 致命坑

    • crontab -r 不会确认,直接删除所有定时任务——先 -l 备份再 -r
    • cron 的环境变量很少(PATH 很短),脚本里要用绝对路径
    • cron 的输出默认会通过邮件发送(如果系统有邮件服务),重定向到文件避免邮件堆积
    • 按天(第 3 位)和按周(第 5 位)同时指定成非 * 值时是”或”的关系,不是你想要的”且”

③ 定时任务最佳实践

1
2
3
4
5
# 正确示例(全部使用绝对路径,重定向输出)
*/10 * * * * /usr/bin/php /home/user/scripts/cleanup.php >> /var/log/cleanup.log 2>&1

# 错误示例(使用相对路径,cron 的 PATH 可能找不到)
*/10 * * * * php cleanup.php

排查 cron 不执行的标准步骤

  1. 检查 cron 服务是否运行:systemctl status cron(或 crond
  2. 检查命令用绝对路径了吗?(在 cron 里 PATH=/usr/bin:/bin 通常很有限)
  3. 检查脚本是否有执行权限:chmod +x script.sh
  4. 查看 cron 日志:grep CRON /var/log/syslog
  5. 先重定向输出到文件看报错:* * * * * /path/script >> /tmp/debug.log 2>&1

今日必刷(全部终端实操)💪

  1. 添加一个定时任务:每 1 分钟向 /tmp/heartbeat.log 写入当前时间
  2. 等待 3 分钟,查看 /tmp/heartbeat.log 确认任务在执行
  3. 备份当前 crontab,然后添加一个每天凌晨 3:00 执行的任务(命令任意)
  4. 确认无误后,用 crontab -r 删除所有,再从备份恢复
  5. 排错题:你在 crontab 里加了 */2 * * * * /home/user/cleanup.sh,脚本手动执行正常,但 cron 不执行——写出排查清单,按顺序排查
  6. 排错题:你想让脚本在”既是一个月的 5 号、又恰好是周五”时执行,于是写了 0 2 5 * 5——结果发现脚本在每个月 5 号(无论周几)和每个周五(无论几号)都会执行。为什么会这样?提示:当”日”(第 3 位)和”周”(第 5 位)同时为非 * 值时,cron 的匹配逻辑是”或”还是”且”?怎么修正才能实现真正的”且”?(提示:在脚本开头用 date 判断)

📚 命令详解

命令 详细参考
crontab 系统管理-crontab

Day 5:本周串联实操

今日目标:网络诊断 → 远程连接 → 文件传输 → 系统监控 → 定时上报——一整条运维链路 🎯

命令速览(本周全部命令)

ping curl wget ss netstat ip ifconfig ssh ssh-keygen ssh-copy-id scp df du free uptime uname who crontab

场景:搭建一个简易的服务器监控上报系统

你有一台远程服务器,需要写一个监控脚本,每 5 分钟采集系统状态并通过 scp 上报到管理机。

第一步:系统信息采集

创建监控脚本 ~/monitor.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
cat > ~/monitor.sh <<'SCRIPT'
#!/bin/bash
REPORT="/tmp/system-report-$(date +%Y%m%d-%H%M%S).txt"

echo "=== System Report: $(date) ===" > $REPORT
echo "" >> $REPORT

echo "--- Hostname ---" >> $REPORT
hostname >> $REPORT
echo "" >> $REPORT

echo "--- Uptime & Load ---" >> $REPORT
uptime >> $REPORT
echo "" >> $REPORT

echo "--- Memory ---" >> $REPORT
free -h >> $REPORT
echo "" >> $REPORT

echo "--- Disk Usage ---" >> $REPORT
df -h / >> $REPORT
echo "" >> $REPORT

echo "--- Top 5 Large Directories in /var ---" >> $REPORT
du -sk /var/log/* 2>/dev/null | sort -rn | head -5 >> $REPORT
echo "" >> $REPORT

echo "--- Listening Ports ---" >> $REPORT
ss -tulnp 2>/dev/null || netstat -tulnp 2>/dev/null >> $REPORT
echo "" >> $REPORT

echo "--- Logged-in Users ---" >> $REPORT
who >> $REPORT

echo "Report saved to: $REPORT"
SCRIPT

chmod +x ~/monitor.sh

第二步:本地测试

  1. ~/monitor.sh——执行脚本
  2. cat /tmp/system-report-*.txt——查看生成的报告
  3. 验证每个命令的输出是否正确

第三步:设置定时上报

1
2
# 编辑 crontab
crontab -e

在打开的编辑器中,添加以下行(注意:将 $USER 替换为你的实际用户名;此行在 crontab 中不要# 号,# 在 crontab 中代表注释,加了就不会执行):

1
*/5 * * * * /home/$USER/monitor.sh >> /tmp/monitor-cron.log 2>&1
  1. 等待 5-10 分钟,查看 /tmp/ 下生成了几个报告文件
  2. tail -f /tmp/monitor-cron.log——查看执行日志

第四步:远程传输(如果有远程主机)

1
2
# 将报告 scp 到远程主机
scp /tmp/system-report-*.txt user@remote-host:/tmp/reports/

如果没有远程主机,模拟:

  1. mkdir -p /tmp/reports-remote
  2. cp /tmp/system-report-*.txt /tmp/reports-remote/

第五步:网络连接排查

  1. ping -c 3 localhost——本地连通性
  2. ss -tulnp | grep 22——SSH 端口在监听吗?
  3. curl -I http://localhost——如果本机有 Web 服务
  4. ip addr show | grep "inet "——确认自己的 IP

第六步:清理与查看

  1. ls -lh /tmp/system-report-*——查看生成了多少报告
  2. du -sh /tmp/system-report-*——报告占了多少空间
  3. 清理:rm /tmp/system-report-*.txt

今日必刷(全部终端实操)💪

  1. 执行 ~/monitor.sh 生成一份系统报告,查看报告内容
  2. ss -tulnp 列出所有监听端口,找到 SSH 端口
  3. du -sh /var/log/* 2>/dev/null | sort -rh | head -3 找出 /var/log 下最大的 3 个项
  4. 设置一个 crontab:每 10 分钟执行 monitor.sh(注意 cron 中应使用 monitor.sh 的绝对路径,如 /home/你的用户名/monitor.sh
  5. 排错题:cron 定时执行的 monitor.sh 生成的报告 /tmp 下找不到——可能的原因?(至少 3 个)
  6. 排错题df -h 显示 / 分区 98% 已满,你需要快速定位是哪个目录在吃磁盘——写出从 / 开始逐层排查的命令序列

📚 命令详解

命令 详细参考
ping 网络管理-ping
curl 网络管理-curl
wget 网络管理-wget
ss 网络管理-ss
netstat 网络管理-netstat
ip 网络管理-ip
ifconfig 网络管理-ifconfig
ssh 网络管理-ssh
ssh-keygen 网络管理-ssh
ssh-copy-id 网络管理-ssh
scp 网络管理-scp
df 文件与目录管理-df
du 文件与目录管理-du
free 系统管理-free
uptime 进程管理-uptime
uname 系统管理-uname
who 权限与用户管理-who
crontab 系统管理-crontab
0%