🖥️ 第02章 · 文件与目录操作

ls cd pwd cp mv rm mkdir touch ln find

文件与目录操作

这一章讲在文件系统里"搬家"的基本功:看目录、跳位置、复制、移动、删除、建目录、建空文件、做软链接、找文件。这是每天在 /var/www 里部署、备份、改配置都要用的一整套动作。

先记住绝对路径与相对路径

写法 含义 例子
绝对路径 从根 / 开始的完整路径 /var/www/bangdream
相对路径 相对当前目录 ../bangdream
~ 当前用户家目录 /root
. 当前目录 .
.. 上一级目录 ..
pwd                       # 我在哪里
ls /var/www               # 列出 /var/www 下的内容
ls ..                     # 列出上一级目录

提示 绝对路径永远可靠,不依赖"当前在哪"。写脚本、定时任务、systemd 里一律用绝对路径,避免因为工作目录不同而找不到文件。

列目录 ls

ls 是出现频率最高的命令。记住几个常用组合即可。

选项 作用
-l 长格式,含权限、属主、大小、修改时间
-a 显示隐藏文件(以 . 开头)
-h 大小用人类可读单位(K/M/G)
-t 按修改时间排序
-S 按文件大小排序
-R 递归列出子目录
ls -lh /root/scripts            # 最常用:带大小、可读
ls -la /root                    # 连隐藏文件一起看
ls -lht | head -5               # 最近修改的 5 个文件

注意 -h 单独用没意义,要配合 -l(或 -s)才能看到"人类可读大小"。ls 默认不显示隐藏文件,要加 -a。

切换目录 cd 与查看路径 pwd

cd /var/www/bangdream   # 进入应用目录
cd                      # 无参数 = 回用户家目录
cd ..                   # 回上一级
cd -                    # 回到上一个所在目录,来回切换很好用
pwd                     # 确认当前位置

提示 cd - 是"两端目录来回切"的神器:在 /var/www 和 /etc/nginx 之间反复对比配置时,不用记路径。

复制 cp

cp 源文件 目标位置                # 复制一个文件
cp -r 源目录 目标位置             # 递归复制整个目录
cp -p 源文件 目标位置             # 保留原属主与时间戳
cp -i 源文件 目标位置             # 覆盖前先询问(推荐!防误覆盖)

在这台服务器备份配置的常见姿势:

cp -a /etc/nginx/nginx.conf /root/backup/nginx.conf.$(date +%F)
# -a 等价于 -p 打开档案模式,保留属主/时间戳/权限
# $(date +%F) 生成形如 2026-09-08 的日期后缀,避免覆盖旧备份

移动与重命名 mv

mv 既做移动(跨目录)也做重命名(同目录),两者是同一个动作——改变路径。

mv 旧名 新名                      # 重命名
mv 文件 目录/                     # 移动到目录
mv -i 文件 目录/                  # 覆盖前询问

注意 mv 跨文件系统时,其实是"复制后删除"。它不像 rm 那样危险,但如果目标已存在,会直接覆盖而不提示——所以批量移动时加 -i 或先确认目标为空明显更保险。

删除 rm

删除是不可恢复的(没有回收站),务必谨慎。

rm 文件                      # 删除一个文件
rm -r 目录                   # 递归删除目录及其内容
rm -f 文件                   # 强制删除,不提示(危险)
rm -ri 目录                  # 递归删除,每个文件都询问(全人类友好)
rm -rf 目录                  # 递归+强制删除(最危险,几乎不可撤销)

警告 rm -rf 是 Linux 上公认的"高危按钮"。绝不要对 /、/var、/etc 这类根目录做 rm -rf。宁慢勿错:先在 -r 前面加 -i 让系统逐个确认,或用 /root/备份 先拷一份。

在这台服务器上的安全删除习惯:

# 删应用目录前,先确认路径真的对了
cd /var/www && pwd        # 确保人在 /var/www 而不是 /var
rm -ri bangdream          # 逐项确认后再删

建目录 mkdir 与建空文件 touch

mkdir 新目录                # 建一个目录
mkdir -p a/b/c             # 一次性创建多级目录,父目录不存在也自动建
touch app.log              # 创建一个空文件;若已存在则只更新修改时间

提示 mkdir -p 能避免"No such file or directory"报错,写脚本时几乎必用。touch 常用来在部署前"预建"一个会写日志的空文件,或手动刷新文件的修改时间以触发某些监控。

链接 ln:软链接与硬链接

软链接(符号链接)相当于 Windows 的"快捷方式",指到另一个位置,删除原文件后软链接失效。

ln -s 目标位置 链接名     # -s 创建软链接
ls -l                     # 链接会显示为:链接名 -> 目标位置

在这台服务器上的真实例子——很多发行版把 node 符号链接到版本化命名:

ln -sfn /usr/local/bin/node-v24.20.0 /usr/local/bin/node
ls -l /usr/local/bin/node     # 显示 node -> node-v24.20.0

注意 软链接与硬链接的区别:硬链接是"同一个文件的另一个名字",删一个,另一个还在,且不能跨文件系统;软链接只是一个"路径引用",跨文件系统没问题,但原文件一删链接就断。日常绝大多数链接需求用软链接 ln -s 就够了。

找文件 find

示例 作用
find /var/www -name "*.log" 按文件名找(支持通配符)
find /var/www -type d 只找目录
find /var/www -type f -size +100M 找超过 100MB 的文件
find /var/www -mtime -1 找最近 1 天内修改过的文件
find . -name "*.conf" -exec grep -l "server" {} \; 找出含指定内容的文件

在这台服务器上排查磁盘占用:

find /var/log -type f -size +50M -ls     # 找 50M 以上的日志,配合 -ls 看大小

提示 mtime -1 表示"最近 1 天内被改过",mtime +30 表示"超过 30 天没动过",清理旧备份、旧日志很常用。对结果批量施加操作,用 -exec ... \;。

易错点

  • . 和 .. 别拼错:cd ..(两点)回上两级会出错。
  • 删除前先 ls:rm 没有回收站,任何 rm -r 之前先 ls 看清要删什么。
  • 路径里有空格要加引号:"我的 文件" 要加引号,否则会被拆成两个参数。
  • find / 别直接跑:全盘搜索很慢且拖垮 IO,尽量用绝对路径限定范围。

相关命令

ls、pwd、cd、cp、mv、rm、mkdir、touch、ln、find、du(查目录大小)、tree(目录树)。