字数 3030,阅读大约需 16 分钟
文件操作命令
创建文件
# 创建空文件
touch file.txt
# 创建多个文件
touch file1.txt file2.txt file3.txt
# 创建带内容的文件
echo "Hello World" > file.txt
# 追加内容
echo "Second line" >> file.txt
复制文件
# 复制文件
cp source.txt dest.txt
# 复制目录(递归)
cp -r /source/dir /dest/dir
# 保留属性复制
cp -p source.txt dest.txt
# 交互式复制(覆盖前询问)
cp -i source.txt dest.txt
# 显示进度
cp -v source.txt dest.txt
移动/重命名文件
# 移动文件
mv file.txt /new/location/
# 重命名文件
mv oldname.txt newname.txt
# 移动并重命名
mv file.txt /new/location/newname.txt
# 交互式移动
mv -i file.txt dest/
删除文件
# 删除文件
rm file.txt
# 删除多个文件
rm file1.txt file2.txt
# 交互式删除(推荐)
rm -i file.txt
# 强制删除(危险!)
rm -f file.txt
# 删除目录(递归)
rm -r /path/to/dir
# 强制删除目录(极度危险!)
rm -rf /path/to/dir
查找文件
# 按名称查找
find /home -name "*.txt"
# 按类型查找(f 文件,d 目录)
find /var -type f -name "*.log"
# 按大小查找(+100M 大于 100M)
find / -size +100M
# 按时间查找(-7 天以内)
find /home -mtime -7
# 查找并删除
find /tmp -name "*.tmp" -delete
# 查找并执行命令
find /var/log -name "*.log" -exec gzip {} \;
链接文件
# 软链接(类似 Windows 快捷方式)
ln -s /path/to/source linkname
# 硬链接(同一 inode)
ln source.txt hardlink.txt
# 查看链接
ls -l linkname
目录操作命令
创建目录
# 创建单个目录
mkdir newdir
# 创建多级目录(递归)
mkdir -p /path/to/deep/dir
# 创建多个目录
mkdir dir1 dir2 dir3
# 创建目录并设置权限
mkdir -m 755 newdir
切换目录
# 绝对路径
cd /home/longge/projects
# 相对路径
cd projects
# 返回上级
cd ..
# 返回主目录
cd ~
# 或
cd
# 返回上一个目录
cd -
# 查看当前目录
pwd
查看目录内容
# 基本列表
ls
# 详细列表
ls -l
# 显示隐藏文件
ls -a
# 详细 + 隐藏
ls -la
# 人类可读大小
ls -lh
# 按时间排序
ls -lt
# 按大小排序
ls -lS
# 递归显示
ls -lR
# 只显示目录
ls -d */
查看目录大小
# 查看目录总大小
du -sh /path/to/dir
# 查看子目录大小
du -h --max-depth=1 /path/to/dir
# 查看当前目录各文件大小
du -h * | sort -hr
文本查看命令
查看整个文件
# 查看小文件
cat file.txt
# 查看多个文件
cat file1.txt file2.txt
# 显示行号
cat -n file.txt
# 显示非空行号
cat -b file.txt
分页查看
# 分页查看(空格下一页,q 退出)
less file.txt
# 分页查看(不可后退)
more file.txt
# 查看前 N 行
head -n 20 file.txt
# 查看后 N 行
tail -n 20 file.txt
# 实时查看日志(按 Ctrl+C 退出)
tail -f /var/log/syslog
# 实时查看 + 显示已有内容
tail -f -n 50 /var/log/syslog
查看文件行数/字数
# 行数、单词数、字节数
wc file.txt
# 只显示行数
wc -l file.txt
# 只显示单词数
wc -w file.txt
# 只显示字符数
wc -c file.txt
# 统计多个文件
wc -l *.txt
文本处理命令
搜索文本(grep)
# 基本搜索
grep "pattern" file.txt
# 忽略大小写
grep -i "pattern" file.txt
# 显示行号
grep -n "pattern" file.txt
# 反向匹配(不包含)
grep -v "pattern" file.txt
# 递归搜索目录
grep -r "pattern" /path/to/dir
# 显示匹配行前后 3 行
grep -C 3 "pattern" file.txt
# 显示匹配行后 5 行
grep -A 5 "pattern" file.txt
# 显示匹配行前 5 行
grep -B 5 "pattern" file.txt
# 使用正则表达式
grep -E "^[0-9]+" file.txt
# 统计匹配行数
grep -c "pattern" file.txt
文本替换(sed)
# 替换第一个匹配
sed 's/old/new/' file.txt
# 替换所有匹配
sed 's/old/new/g' file.txt
# 直接修改文件
sed -i 's/old/new/g' file.txt
# 备份后修改
sed -i.bak 's/old/new/g' file.txt
# 删除空行
sed '/^$/d' file.txt
# 删除包含 pattern 的行
sed '/pattern/d' file.txt
# 只打印匹配行
sed -n '/pattern/p' file.txt
# 替换第 N 行
sed '5s/old/new/' file.txt
# 替换行范围
sed '1,10s/old/new/g' file.txt
文本提取(cut)
# 按字段提取(冒号分隔)
cut -d: -f1 /etc/passwd
# 提取多个字段
cut -d: -f1,3,7 /etc/passwd
# 按字符位置提取
cut -c1-10 file.txt
# 按字节提取
cut -b1-5 file.txt
文本排序(sort)
# 基本排序
sort file.txt
# 逆序排序
sort -r file.txt
# 数字排序
sort -n file.txt
# 忽略大小写
sort -f file.txt
# 按指定字段排序(冒号分隔,第 3 字段)
sort -t: -k3 /etc/passwd
# 去重排序
sort -u file.txt
# 随机排序
sort -R file.txt
去重(uniq)
# 去重(需要先排序)
sort file.txt | uniq
# 统计重复次数
sort file.txt | uniq -c
# 只显示重复行
sort file.txt | uniq -d
# 只显示不重复行
sort file.txt | uniq -u
文本转换(tr)
# 小写转大写
cat file.txt | tr 'a-z' 'A-Z'
# 大写转小写
cat file.txt | tr 'A-Z' 'a-z'
# 删除指定字符
cat file.txt | tr -d '\r'
# 替换字符
cat file.txt | tr ':' '\t'
# 压缩重复字符
cat file.txt | tr -s ' '
系统信息命令
系统基本信息
# 查看系统信息
uname -a
# 查看内核版本
uname -r
# 查看主机名
hostname
# 查看运行时间
uptime
# 查看登录用户
who
# 查看当前用户
whoami
硬件信息
# 查看 CPU 信息
cat /proc/cpuinfo
# 或
lscpu
# 查看内存信息
cat /proc/meminfo
# 或
free -h
# 查看磁盘信息
df -h
# 查看磁盘分区
fdisk -l
# 查看 PCI 设备
lspci
# 查看 USB 设备
lsusb
系统负载
# 查看进程快照
ps aux
# 查看进程树
pstree
# 实时进程监控
top
# 增强版 top
htop
# 查看系统负载
w
# 查看最后登录
last
网络命令
网络配置
# 查看 IP 地址
ip addr
# 或(旧版)
ifconfig
# 查看路由表
ip route
# 或
route -n
# 查看 DNS 配置
cat /etc/resolv.conf
# 查看网络接口
ip link show
网络连通性
# Ping 测试
ping -c 4 google.com
# 跟踪路由
traceroute google.com
# 或
tracepath google.com
# 测试端口连通性
telnet host port
# 或
nc -zv host port
网络诊断
# 查看监听端口
netstat -tulpn
# 或(新版)
ss -tulpn
# 查看网络连接
netstat -an
# 或
ss -an
# DNS 查询
nslookup domain.com
# 或
dig domain.com
# 查看主机名解析
cat /etc/hosts
下载文件
# 下载文件
wget https://example.com/file.zip
# 指定输出文件名
wget -O myfile.zip https://example.com/file.zip
# 断点续传
wget -c https://example.com/file.zip
# 后台下载
wget -b https://example.com/file.zip
# 使用 curl 下载
curl -O https://example.com/file.zip
# 指定输出文件名
curl -o myfile.zip https://example.com/file.zip
进程管理命令
查看进程
# 查看所有进程
ps aux
# 查看当前用户进程
ps u
# 查看进程树
pstree
# 按名称查找进程
ps aux | grep nginx
# 查看进程详细信息
cat /proc/PID/status
终止进程
# 正常终止
kill PID
# 强制终止
kill -9 PID
# 按名称终止
pkill processname
# 按名称终止(交互确认)
killall -i processname
# 优雅终止(发送 SIGTERM)
kill -15 PID
后台任务
# 后台运行
command &
# 查看后台任务
jobs
# 将后台任务调到前台
fg %1
# 将前台任务调到后台(先 Ctrl+Z)
bg %1
# 断开终端继续运行
nohup command &
# 或使用 screen
screen -S sessionname
进程优先级
# 以指定优先级启动(-20 最高,19 最低)
nice -n 10 command
# 修改运行中进程优先级
renice -n 5 -p PID
压缩解压命令
tar(打包工具)
# 创建 tar 包
tar -cvf archive.tar file1 file2
# 创建 gzip 压缩
tar -czvf archive.tar.gz /path/to/dir
# 创建 bzip2 压缩
tar -cjvf archive.tar.bz2 /path/to/dir
# 解压 tar 包
tar -xvf archive.tar
# 解压 gzip 压缩
tar -xzvf archive.tar.gz
# 解压 bzip2 压缩
tar -xjvf archive.tar.bz2
# 查看 tar 包内容
tar -tvf archive.tar
# 解压到指定目录
tar -xzvf archive.tar.gz -C /target/dir
# 只解压特定文件
tar -xzvf archive.tar.gz file1.txt
zip/unzip
# 压缩文件
zip archive.zip file1 file2
# 压缩目录(递归)
zip -r archive.zip /path/to/dir
# 解压文件
unzip archive.zip
# 解压到指定目录
unzip archive.zip -d /target/dir
# 查看压缩包内容
unzip -l archive.zip
gzip/gunzip
# 压缩文件
gzip file.txt
# 生成 file.txt.gz
# 解压文件
gunzip file.txt.gz
# 或
gzip -d file.txt.gz
# 查看压缩文件内容
zcat file.txt.gz
命令组合技巧
管道(|)
# 将前一个命令的输出作为后一个命令的输入
ps aux | grep nginx
# 多段管道
ps aux | grep nginx | grep -v grep | wc -l
# 查看日志中的错误
tail -f /var/log/syslog | grep -i error
重定向(> >>)
# 覆盖输出
echo "hello" > file.txt
# 追加输出
echo "world" >> file.txt
# 错误重定向
command 2> error.log
# 标准输出和错误都重定向
command > output.log 2>&1
# 丢弃输出
command > /dev/null 2>&1
命令分隔符
# 顺序执行(无论前一个是否成功)
command1 ; command2
# 成功才执行下一个
command1 && command2
# 失败才执行下一个
command1 || command2
# 组合使用
command1 && command2 || echo "Failed"
命令替换
# 使用 $()
echo "Today is $(date)"
# 使用反引号(旧语法)
echo "Today is `date`"
# 嵌套使用
echo "Files: $(ls -la | wc -l)"
xargs(参数传递)
# 将输入转换为参数
find . -name "*.txt" | xargs rm
# 安全处理含空格的文件名
find . -name "*.txt" -print0 | xargs -0 rm
# 限制每次处理的参数数量
find . -name "*.txt" | xargs -n 10 rm
# 交互式确认
find . -name "*.txt" | xargs -p rm
避坑指南
坑 1:rm -rf 误删
# ❌ 错误:变量为空时删除根目录
rm -rf $MYDIR/*
# ✅ 正确:先检查变量
if [ -n "$MYDIR" ]; then
rm -rf "$MYDIR"/*
fi
# 或使用交互式
rm -ri "$MYDIR"/*
坑 2:cp 覆盖重要文件
# ❌ 错误:直接覆盖
cp new.conf /etc/nginx/nginx.conf
# ✅ 正确:先备份
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
cp new.conf /etc/nginx/nginx.conf
# 或使用交互式
cp -i new.conf /etc/nginx/nginx.conf
坑 3:grep 匹配意外内容
# ❌ 错误:匹配到 grep 自身
ps aux | grep nginx
# ✅ 正确:排除 grep 进程
ps aux | grep nginx | grep -v grep
# 或使用正则
ps aux | grep [n]ginx
坑 4:管道丢失错误
# ❌ 错误:只检查最后一个命令
command1 | command2 | command3
# ✅ 正确:启用管道错误检查
set -o pipefail
command1 | command2 | command3
坑 5:文件名含空格
# ❌ 错误:空格导致参数分裂
for file in *.txt; do
rm $file
done
# ✅ 正确:加引号
for file in *.txt; do
rm "$file"
done
# 或使用 find
find . -name "*.txt" -print0 | xargs -0 rm
练习题
基础题
- 1. 查找
/home 目录下所有 .log 文件 - 3. 将
/var/log/syslog 中包含 "error" 的行提取到新文件
进阶题
- 4. 找出系统中大于100M 的文件,并按大小排序
- 5. 批量将当前目录下所有
.txt 文件转为 .bak 备份 - 6. 监控 nginx 访问日志,实时显示 404 错误
答案
# 1
find /home -name "*.log"
# 2
wc -l *.txt | tail -1
# 3
grep "error" /var/log/syslog > errors.txt
# 4
find / -type f -size +100M -exec ls -lh {} \; | sort -k5 -h
# 5
for f in *.txt; do cp "$f" "${f%.txt}.bak"; done
# 6
tail -f /var/log/nginx/access.log | grep " 404 "
📊 命令速查表
| | |
|---|
| cat | cat file.txt |
| less | less file.txt |
| tail | tail -f log.txt |
| grep | grep "error" log.txt |
| sed | sed 's/a/b/g' file.txt |
| find | find /home -name "*.txt" |
| ps | ps aux |
| kill | kill -9 PID |
| df | df -h |
| du | du -sh /dir |
| tar -czvf | tar -czvf archive.tar.gz dir/ |
| tar -xzvf | tar -xzvf archive.tar.gz |
| wget | wget url |
| ping | ping google.com |
| ss | ss -tulpn |