文件管理与vim编辑器

瑞克 0 阅读 linux服务

文件管理与vim编辑器

写在前面:在Windows里,你习惯用鼠标双击文件夹、拖拽文件。而在Linux的世界里,键盘才是主角。文件管理命令就像你的"意念操控"——想在哪儿创建文件、移动文件、删除文件,只需敲几个字母。本章将带你掌握Linux文件操作的全部核心命令,并学会使用被誉为"编辑器之神"的vim。


2.1 目录操作命令:在Linux中"走路"

生活类比

把Linux目录系统想象成一栋大型商场:

  • pwd = "我在哪?"——查看当前所在楼层(目录)
  • cd = "去那里"——走到另一个楼层或商铺
  • ls = "看看周围有什么"——浏览当前楼层的店铺列表
  • mkdir = "开一间新店"——创建新目录
  • rm = "拆除"——删除文件或目录

2.1.1 pwd —— 我在哪?

# 显示当前工作目录的完整路径
pwd
# 输出示例:/home/teacher

# 显示物理路径(解析软链接后的真实路径)
pwd -P

2.1.2 cd —— 切换目录

# 进入指定目录
cd /etc                    # 进入/etc(绝对路径)
cd Documents               # 进入当前目录下的Documents(相对路径)

# 特殊路径符号
cd ~                       # 回到自己的家目录(~ 代表 /home/你的用户名)
cd -                       # 回到刚才所在的目录(像"撤销"按钮)
cd ..                      # 回到上一级目录(.. 代表父目录)
cd ../..                   # 回到上两级目录
cd /                       # 进入根目录
cd                         # 不带参数,等于 cd ~

路径类比

路径写法类比说明
/home/teacher/file.txt"北京市海淀区XX路XX号"绝对路径,从根目录开始
Documents/file.txt"隔壁房间里的文件"相对路径,从当前位置开始
../boss/report.xlsx"楼上同事的报告"相对路径,先上一级再进入

2.1.3 ls —— 看看周围有什么

# 基本用法
ls                         # 列出当前目录内容
ls /etc                    # 列出指定目录内容

# 常用参数组合
ls -l                      # 长格式显示(详细信息)—— 最常用!
ls -la                     # 包含隐藏文件(以.开头的文件)
ls -lh                     # 文件大小以人类可读格式显示(KB/MB/GB)
ls -lt                     # 按修改时间排序(最新的在前)
ls -ltr                    # 按修改时间排序(最旧的在前,r=reverse)
ls -lS                     # 按文件大小排序(最大的在前)
ls -lR                     # 递归显示子目录

# 组合使用(实战常用)
ls -lah /var/log/          # 查看日志目录详情
ls -lt /home/ | head -10   # 看最近修改的10个文件

ls -l 输出解读

-rw-r--r--  1 teacher  staff  4096  2024-03-15 10:30  homework.txt
│││ │││ │││  │  │        │      │       │          │        │
│││ │││ │││  │  │        │      │       │          │        └── 文件名
│││ │││ │││  │  │        │      │       │          └── 修改时间
│││ │││ │││  │  │        │      │       └── 文件大小(字节,加-h参数后显示KB/MB)
│││ │││ │││  │  │        │      └── 所属组
│││ │││ │││  │  │        └── 所属用户
│││ │││ │││  │  └── 硬链接数
│││ │││ │││  └── 权限:组内用户权限
│││ │││ │└── 权限:文件所有者权限
│││ │││ └── 权限:其他用户权限
│││ └── 文件类型:- 普通文件 / d 目录 / l 软链接 / c 字符设备 / b 块设备

文件类型速查

首字符类型说明
-普通文件文本文件、二进制文件等
d目录文件夹
l软链接类似Windows的快捷方式
c字符设备终端、键盘等
b块设备硬盘、U盘等
s套接字进程间通信
p管道进程间通信

2.1.4 mkdir —— 创建目录

# 创建单个目录
mkdir homework

# 创建多级嵌套目录(最常用)
mkdir -p /data/school/math/2024
# -p 参数:父目录不存在时自动创建,已存在时不报错

# 一次创建多个目录
mkdir dir1 dir2 dir3

# 创建目录并显示过程
mkdir -pv /project/src/main
# 输出:
# mkdir: 已创建目录 '/project'
# mkdir: 已创建目录 '/project/src'
# mkdir: 已创建目录 '/project/src/main'

2.1.5 rm —— 删除(危险命令!)

警告:Linux的rm命令删除后不进入回收站,直接永久删除!请务必谨慎。

# 删除单个文件(会提示确认)
rm homework.txt

# 删除文件不提示(-f = force)
rm -f homework.txt

# 删除目录及其所有内容(-r = recursive)
rm -r old_project/

# 【危险】强制删除目录不提示
rm -rf old_project/

# 【极度危险】千万不要执行以下命令!
# rm -rf /          ← 这会删除整个系统!!!
# rm -rf /*         ← 效果同上!!!

安全使用建议

# 技巧1:给rm加上交互确认(默认alias)
alias rm='rm -i'

# 技巧2:删除前先看看要删什么
ls old_project/     # 先确认内容
rm -r old_project/  # 再删除

# 技巧3:用trash-cli代替rm(移入回收站而非永久删除)
# Debian系安装:sudo apt install trash-cli
# RHEL系安装:sudo dnf install trash-cli
trash homework.txt  # 移入回收站
trash-list          # 查看回收站
trash-empty         # 清空回收站

2.1.6 cp —— 复制

# 复制文件
cp source.txt destination.txt        # 复制并重命名
cp source.txt /backup/               # 复制到指定目录

# 复制目录(必须加-r参数)
cp -r project/ /backup/project/      # 递归复制整个目录

# 保留文件属性复制(-a = archive,最推荐)
cp -a project/ /backup/project/      # 保留权限、时间戳、软链接等

# 覆盖前提示确认
cp -i source.txt destination.txt

# 显示复制过程
cp -rv project/ /backup/             # -v = verbose 详细输出

# 只复制比目标新的文件(增量备份)
cp -u source.txt destination.txt

2.1.7 mv —— 移动与重命名

# 重命名文件(源和目标在同一目录)
mv old_name.txt new_name.txt

# 移动文件到另一个目录
mv homework.txt /home/teacher/homework/

# 移动目录
mv project/ /data/projects/

# 覆盖前确认
mv -i source.txt /destination/

# 不覆盖已存在的文件
mv -n source.txt /destination/       # -n = no-clobber

想一想cp file.txt /backup/mv file.txt /backup/ 执行完后,原位置的 file.txt 分别还存在吗?


2.1.8 find —— 文件搜索利器

类比:如果目录是一栋大楼,find就是保安——你可以让他按名字、大小、时间等各种条件搜索。

# 按文件名搜索(最常用)
find /home -name "homework*"         # 搜索以homework开头的文件
find / -name "*.conf" -type f        # 全盘搜索.conf配置文件

# 按文件类型搜索
find /var/log -type f -name "*.log"  # 搜索日志文件
find /home -type d -name "backup*"   # 搜索目录

# 按大小搜索
find / -size +100M                   # 搜索大于100MB的文件
find /home -size +10M -size -100M    # 搜索10MB到100MB之间的文件

# 按修改时间搜索
find /var/log -mtime -1              # 最近1天内修改过的文件
find /home -mtime +30                # 30天前修改的文件

# 按权限搜索
find / -perm 777 -type f             # 搜索777权限的文件(安全隐患!)

# 搜索后执行操作
find /tmp -type f -mtime +7 -delete  # 删除/tmp下7天前的文件
find /var/log -name "*.gz" -exec ls -lh {} \; # 查看压缩日志详情

find 文件大小参数速查

参数含义示例
c字节-size 100c (100字节)
kKB-size 100k (100KB)
MMB-size +50M (大于50MB)
GGB-size +1G (大于1GB)

2.1.9 locate —— 快速定位

# locate 基于预建数据库,速度极快但可能不够实时
locate nginx.conf                    # 搜索包含nginx.conf的路径
locate -i readme                     # 不区分大小写搜索

# 更新locate数据库(搜索不到新文件时使用)
sudo updatedb

find vs locate 对比

特性findlocate
搜索方式实时扫描磁盘查询预建数据库
搜索速度较慢极快
搜索准确性完全准确可能遗漏新文件
搜索条件丰富(名称/大小/时间/权限)仅按文件名
安装系统自带可能需安装mlocate

想一想:如果你需要找到系统中所有大于500MB的日志文件并删除30天前的,你会怎么写find命令?


2.2 文件查看命令

2.2.1 cat —— 显示文件全部内容

# 显示文件内容
cat /etc/hostname
cat /etc/os-release

# 显示行号
cat -n /etc/hosts

# 合并多个文件
cat file1.txt file2.txt > merged.txt

# 追加内容
cat >> notes.txt << EOF
这是追加的一行内容
第二行内容
EOF

2.2.2 head / tail —— 查看文件头尾

# 查看文件前10行(默认)
head /var/log/syslog

# 查看前20行
head -n 20 /var/log/syslog

# 查看文件最后10行(默认)
tail /var/log/syslog

# 查看最后50行
tail -n 50 /var/log/syslog

# 【超实用】实时跟踪日志输出(运维必备!)
tail -f /var/log/syslog
# 日志有更新时会自动显示,按Ctrl+C退出

# 同时跟踪多个日志
tail -f /var/log/syslog /var/log/auth.log

运维经验:排查问题时,先用tail -f实时跟踪日志,然后重现问题,就能立刻看到报错信息。

2.2.3 less / more —— 分页浏览

# less:支持上下翻页,推荐!(按q退出)
less /var/log/syslog
# 空格=下一页, b=上一页, /=搜索, n=下一个, g=开头, G=末尾, q=退出

# more:只能向下翻页(较简单)
more /var/log/syslog     # 空格=下一页,q=退出

2.2.4 wc —— 统计文件信息

# 统计行数、单词数、字节数
wc /etc/hosts
# 输出示例:  12  45  512 /etc/hosts
#           行  词   字节

# 只统计行数(最常用)
wc -l /etc/hosts

# 只统计单词数
wc -w essay.txt

# 只统计字节数
wc -c file.txt

# 实战:统计系统中有多少个用户
wc -l /etc/passwd

想一想:如果你有一个10GB的日志文件,想找到其中包含"ERROR"的行,你会用cat还是grep?为什么?用less打开这个文件会不会很慢?


2.3 文件搜索进阶

2.3.1 grep —— 文本内容搜索(最强大工具之一)

类比:如果find是"按名字找人",那grep就是"按长相找人"——它搜索文件里面的内容。

# 基本搜索
grep "error" /var/log/syslog
grep -i "error" /var/log/syslog           # 忽略大小写
grep -n "error" /var/log/syslog           # 显示行号

# 递归搜索目录下所有文件(最常用!)
grep -rn "password" /etc/                 # 搜索并显示行号

# 反向搜索(不包含关键词的行)
grep -v "debug" /var/log/syslog

# 使用正则表达式
grep "^root" /etc/passwd                  # 以root开头的行

# 显示匹配行的上下文
grep -B 3 "error" app.log                 # 前3行
grep -A 5 "error" app.log                 # 后5行
grep -C 2 "error" app.log                 # 前后各2行

# 管道组合(实战高频!)
ps aux | grep nginx                       # 查找nginx进程
ss -tlnp | grep :80                       # 查看80端口
cat /etc/passwd | grep "/bin/bash"        # 查找使用bash的用户

# 多关键词搜索
grep -E "error|warning|critical" /var/log/syslog

2.3.2 which / whereis / type —— 查找命令位置

# which:查找命令的可执行文件路径
which python3
# 输出:/usr/bin/python3

which vim
# 输出:/usr/bin/vim

# whereis:查找命令的二进制文件、源码和手册页
whereis nginx
# 输出:nginx: /usr/sbin/nginx /usr/share/man/man8/nginx.8.gz

whereis python3
# 输出:python3: /usr/bin/python3 /usr/lib/python3 /usr/share/man/man1/python3.1.gz

# type:最全面,显示命令的类型(内置/别名/外部程序)
type ls
# 输出:ls 是 `ls --color=auto' 的别名

type cd
# 输出:cd 是 shell 内嵌

type grep
# 输出:grep 是 /usr/bin/grep

三者对比

命令搜索范围返回信息适用场景
whichPATH环境变量可执行文件路径快速找到命令在哪
whereis系统标准位置二进制+源码+手册全面了解命令位置
typeshell层面类型判断判断是内建/别名/外部

2.4 文件权限查看

快速预览

# 查看文件权限
ls -l /etc/passwd
# 输出:-rw-r--r-- 1 root root 2048 Mar 15 10:30 /etc/passwd
#       │││ │││ │││
#       │││ │││ └── 其他用户:r--(只读)
#       │││ └──── 所属组:r--(只读)
#       └────── 文件所有者:rw-(读写)

# 查看目录权限
ls -ld /home/teacher/
# 输出:drwxr-x--- 5 teacher teacher 4096 Mar 15 10:30 /home/teacher/
#       d│││ │││ │││
#       ││││ │││ └── 其他用户:---(无任何权限)
#       ││││ └──── 所属组:r-x(读+执行=可进入)
#       │└────── 文件所有者:rwx(读写执行=完全控制)
#       └── d表示目录

权限对照表

权限字母数字对文件的含义对目录的含义
r4查看内容列出目录内容(ls)
w2修改内容在目录中创建/删除文件
执行x1运行程序进入目录(cd)
-0无权限无权限

权限修改(chmod)和高级权限内容将在第三章"用户与权限管理"中详细讲解。


2.5 软硬链接

生活类比

  • 硬链接:像给同一份文件"取了两个名字"——两个文件名指向磁盘上的同一块数据,删掉一个名字,另一个还能正常访问。
  • 软链接(符号链接):像Windows的"快捷方式"——它只是一个"指路牌",指向真正的文件。如果把真正的文件删了,软链接就变成了"死链"。

创建链接

# 创建软链接(symbolic link)—— 最常用
ln -s /etc/nginx/nginx.conf /home/teacher/nginx_config_link
# -s 表示创建软链接
# 目标文件              链接文件(快捷方式的名字)

# 创建硬链接(hard link)
ln /data/report.txt /home/teacher/report_hardlink

# 查看链接关系
ls -l /home/teacher/nginx_config_link
# 输出:lrwxrwxrwx 1 teacher teacher 21 Mar 15 /home/teacher/nginx_config_link -> /etc/nginx/nginx.conf
#      l                                        箭头指向目标文件

# 查看文件的所有硬链接
find / -samefile /data/report.txt 2>/dev/null

软硬链接对比表

特性硬链接软链接
创建命令ln 源文件 链接名ln -s 源文件 链接名
本质同一数据多个名字指向目标的路径快捷方式
跨文件系统不可以可以
链接到目录不允许允许
源文件删除后链接仍然有效链接失效(变成死链)
inode编号与源文件相同独立的inode
常用场景数据备份防误删配置文件快捷访问
# 实战:验证软硬链接区别
echo "Hello Linux" > original.txt     # 创建原文件
ln original.txt hardlink.txt          # 创建硬链接
ln -s original.txt softlink.txt       # 创建软链接

# 查看inode编号
ls -li original.txt hardlink.txt softlink.txt
# hardlink.txt 和 original.txt 的inode编号相同
# softlink.txt 的inode编号不同

# 删除原文件
rm original.txt

# 结果
cat hardlink.txt   # 正常显示 "Hello Linux"
cat softlink.txt   # 报错:No such file or directory

想一想:如果你是一个系统管理员,需要让多个目录共享同一份配置文件,修改一份其他都同步更新,你会用硬链接还是软链接?为什么?


2.6 Vim编辑器:编辑器之神

为什么学Vim?

在服务器上没有图形界面,当你需要修改配置文件时,vi/vim是你最可靠的伙伴。它就像"瑞士军刀中的瑞士军刀"——看起来朴素,但功能极其强大。

2.6.1 Vim的三种模式

类比:把vim想象成一个有三档变速的自行车。

  • 命令模式(默认档):浏览、删除、复制、粘贴——就像"阅读模式"
  • 输入模式(编辑档):打字输入内容——就像"写作模式"
  • 末行模式(指令档):执行保存、退出、搜索替换等高级命令——就像"管理模式"
          ┌──────────┐
    i     │          │   Esc
  ┌──────→│ 输入模式  │──→┐
  │       │ (编辑档)  │   │
  │       └──────────┘   │
  │                      ↓
┌─┴────────┐         ┌──────────┐
│ 命令模式  │←──Esc──│ 末行模式  │
│ (默认档)  │── : ──→│ (指令档)  │
└──────────┘         └──────────┘

2.6.2 基本操作

# 启动vim
vim filename              # 打开或创建文件
vim +100 filename         # 打开文件并跳到第100行
vim -R filename           # 只读模式打开

命令模式 —— 光标移动

按键功能
h j k l左/下/上/右移动
0 / $跳到行首 / 行尾
w / b下一个单词 / 上一个单词
gg / G跳到文件开头 / 末尾
:nnG跳到第n行(如:50
Ctrl+f / Ctrl+b向下翻页 / 向上翻页

命令模式 —— 进入输入模式

按键功能
i / a在光标 / 开始输入
I / A行首 / 行尾开始输入
o / O下方 / 上方新建一行并输入

2.6.3 常用编辑操作(命令模式)

按键功能按键功能
x删除光标字符yy复制当前行
dd删除(剪切)当前行3yy复制3行
3dd删除3行yw复制一个单词
dG从当前行删到文件末尾p粘贴到光标下方/后方
dw删除一个单词P粘贴到光标上方/前方
d$从光标删到行尾u撤销(undo)
Ctrl+r重做(redo)
.重复上一个操作

实战技巧:在行首输入5.可以重复上一个操作5次。比如你删除了一行,然后按5.就会再删除5行。

2.6.4 末行模式操作

输入 : 进入末行模式:

保存与退出

命令功能命令功能
:w保存:q退出
:wq / :x保存并退出:q!强制退出不保存
:w filename另存为:wq!强制保存退出

搜索

命令功能
/关键词向下搜索
?关键词向上搜索
n / N下一个 / 上一个匹配

搜索替换(超实用!)

" 替换当前行所有old为new
:s/old/new/g

" 替换全文所有old为new(最常用!)
:%s/old/new/g

" 替换第10到20行
:10,20s/old/new/g

" 替换时确认每一个(安全模式)
:%s/old/new/gc

" 实战:把nginx配置中所有80端口改为8080
:%s/listen 80/listen 8080/g

其他末行命令

set nu            " 显示行号
split             " 上下分屏
vsplit            " 左右分屏
:!ls              " 执行shell命令
syntax on         " 语法高亮
:100              " 跳到第100行

2.6.5 多文件编辑速查

# 同时打开多个文件
vim file1.txt file2.txt        # :n下一个, :N上一个

# 分屏编辑
:split file2.txt               # 上下分屏
:vsplit file2.txt              # 左右分屏
Ctrl+w w                       # 在分屏间切换

# 对比两个文件差异
vim -d file1.conf file2.conf   # diff模式,高亮差异

2.6.6 .vimrc 配置文件

类比:.vimrc就像vim的"装修方案"——设置好后,每次打开vim都会自动应用。

# .vimrc文件位置:~/.vimrc(每个用户自己的配置)
# 或 /etc/vimrc(全局配置)
vim ~/.vimrc

推荐的.vimrc配置

" === 基础设置 ===
set nocompatible        " 关闭vi兼容模式
set encoding=utf-8      " UTF-8编码

" === 显示设置 ===
set number              " 显示行号
set cursorline          " 高亮当前行
set showmatch           " 高亮匹配括号
syntax on               " 开启语法高亮

" === 缩进设置 ===
set tabstop=4           " Tab键宽度为4个空格
set shiftwidth=4        " 自动缩进宽度
set expandtab           " Tab转为空格
set autoindent          " 自动缩进

" === 搜索设置 ===
set hlsearch            " 搜索高亮
set incsearch           " 输入时实时搜索
set ignorecase          " 搜索忽略大小写

" === 实用设置 ===
set wildmenu            " 命令行补全
set ruler               " 显示光标位置
set mouse=a             " 启用鼠标

" === 快捷键 ===
inoremap jj <Esc>       " jj退出输入模式(比Esc方便)
nnoremap <F5> :!python3 %<CR>  " F5运行Python脚本

小贴士:修改.vimrc后,在vim中执行:source ~/.vimrc即可生效,无需重启。


想一想:为什么vim默认使用命令模式而不是输入模式?对于一个需要大量编辑文本的运维工程师来说,这种设计有什么好处?(提示:想想你编辑配置文件时,是浏览/搜索的时间多还是打字的时间多?)


本章小结

知识点核心命令
查看当前目录pwd
切换目录cd, cd ~, cd .., cd -
列出文件ls -lah, ls -lt
创建目录mkdir -p
删除rm -rf(谨慎使用!)
复制cp -a, cp -r
移动/重命名mv
搜索文件find(按条件), locate(按名称)
查看文件cat, head, tail -f, less
内容搜索grep -rn
统计wc -l
查找命令which, whereis, type
链接ln -s(软链接), ln(硬链接)
vim模式命令模式 / 输入模式 / 末行模式
vim编辑i输入, yy复制, dd删除, p粘贴, u撤销
vim替换:%s/old/new/g

运维常用命令精选

以下命令是运维工程师日常文件操作的"高频词",建议反复练习直到形成肌肉记忆。

日志分析三剑客

# 1. 查看最近50行错误日志
tail -n 50 /var/log/syslog | grep -i "error"

# 2. 统计Nginx访问日志中各IP的访问次数(Top 10)
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10

# 3. 实时跟踪多个日志文件
tail -f /var/log/syslog /var/log/auth.log /var/log/nginx/error.log

文件批量操作

# 批量重命名:给所有.txt文件加上日期后缀
for f in *.txt; do mv "$f" "${f%.txt}_$(date +%Y%m%d).txt"; done

# 批量查找并替换文件内容
sed -i 's/old_domain.com/new_domain.com/g' /etc/nginx/sites-available/*

# 快速创建一个100MB的测试文件
dd if=/dev/zero of=testfile bs=1M count=100

目录空间分析

# 查看各目录占用空间
du -sh /var/log/*

# 找出最大的10个目录
du -sh /* 2>/dev/null | sort -rh | head -10

# 查看当前目录树结构
tree -L 2 /etc/nginx/
# 安装tree:sudo apt install tree (Debian系) / sudo dnf install tree (RHEL系)

Vim效率提升技巧

" 1. 录制宏(批量操作利器)
"    qa → 开始录制  →  执行操作  →  q停止  →  @a执行  →  10@a执行10次

" 2. 全局命令(对匹配行执行操作)
:g/error/d       " 删除所有包含error的行
:g/^$/d          " 删除所有空行
:v/pattern/d     " 删除不包含pattern的行

" 3. 可视模式批量编辑
"    Ctrl+v → 列选择 → 按I → 输入内容 → Esc(每行同一位置插入)

趣味命令专栏

# 1. 用tree命令看目录树——一目了然
# 安装:sudo apt install tree (Debian系) / sudo dnf install tree (RHEL系)
tree /etc/nginx -L 2

# 2. 用sl开火车(当有人打错ls时...)
sl    # 一辆蒸汽火车从屏幕上开过!

# 3. 用figlet生成ASCII艺术字
figlet "Hello Linux"

# 4. 用cal看日历(数学老师排课用)
cal             # 当月日历
cal 2024        # 2024年全年日历

# 5. 终端里的矩阵雨(致敬黑客帝国)
cmatrix         # 按q退出

# 6. 统计你的Linux"工龄"
history | wc -l # 看看你已经敲了多少条命令!

本章思考题

  1. 写出查找/var/log目录下所有大于10MB、且最近7天内修改过的日志文件的命令。
  2. 用vim打开一个文件,如何快速把所有"192.168.1.100"替换为"192.168.1.200"?
  3. 解释软链接和硬链接的区别,并各举一个实际使用场景。
  4. 如果不小心执行了rm -rf删除了重要文件,在Linux中有没有办法恢复?为什么?