文件管理命令详解2
sort - 文本排序工具
基础语法
sort [选项] [文件名]
# 支持管道输入(对其他命令输出排序)
命令 | sort [选项]
# 排序后输出到新文件(避免覆盖原文件)
sort [选项] 源文件 -o 输出文件
必记基础选项(含运维场景注解)
选项 功能描述 运维实战案例
选项 -n 按数字大小排序(默认按字符排序,如“10”<“2”) sort -n bandwidth.log → 按带宽数值(Mbps)排序,避免“10Mbps”排在“2Mbps”前
选项 -r 反向排序(从大到小/从Z到A) sort -nr delay.log → 按网络延迟数值反向排序,优先看延迟最高的记录
选项 -k 列数 按指定列排序(默认按整行,列用空格/制表符分隔) sort -k3 -n traffic.log → 按流量日志第3列(流量数值)排序
选项 -t 分隔符 自定义列分隔符(默认空格/制表符,适用于CSV、配置类文件) sort -t ',' -k2 -n ip_list.csv → 按CSV文件第2列(IP段)数字排序
选项 -u 去除重复行(排序后保留唯一行,重复行只留第一行) sort -u mac_addr.log → 过滤网络设备MAC地址日志中的重复记录
选项 -o 文件名 将排序结果输出到指定文件(替代 > ,避免覆盖原文件) sort -n log.txt -o sorted_log.txt → 排序后保存到新文件,原文件不变
进阶选项与场景化用法
1. 多列排序(运维高频)
-k 列数1,列数1 选项1 -k 列数2,列数2 选项2 :先按列1排序,列1相同则按列2排序( 列数1,列数1 表示仅对该列排序,避免跨列影响)。
案例:对网络流量日志(格式: IP 端口 流量(MB) ),先按“流量”降序,流量相同时按“端口”升序:
# 日志内容示例:
192.168.1.10 80 500
192.168.1.20 443 800
192.168.1.10 22 500
# 多列排序命令:
sort -k3,3nr -k2,2n traffic.log
# 结果:先按第3列(流量)降序,再按第2列(端口)升序
192.168.1.20 443 800
192.168.1.10 22 500
192.168.1.10 80 500
2. 按字母/日期/月份排序
选项 -f :忽略大小写排序(如“A”和“a”视为相同)
例: sort -f device_name.log → 忽略设备名称大小写排序(“H3C”和“h3c”相邻)
选项 -M :按月份排序(Jan→Feb→...→Dec,识别英文月份缩写)
例: sort -k2M monthly_report.log → 按日志第2列(月份)排序,避免“Jan”排在“Dec”后
选项 -d :仅按字母、数字、空格排序(忽略标点符号,适用于带特殊字符的配置文件)
例: sort -d router_config.log → 排序时忽略配置中的“#”“!”等符号
3. 稳定排序与重复行处理
选项 -s :稳定排序(当排序键值相同时,保留原文件中的行顺序,避免打乱关联记录)
案例:对“IP+状态”日志排序,状态相同则保留原日志顺序:
sort -k2 -s status.log
选项 -c :检查文件是否已排序(仅输出是否有序,不输出内容,用于验证排序结果)
例: sort -nc sorted.log → 若有序无输出,无序则提示“sort: sorted.log:X: disorder: 内容”
运维场景专属实战案例
案例1:按带宽数值排序,找出流量TOP10的IP
网络流量日志(traffic.log)格式: IP 带宽(Mbps) ,需按带宽降序,取前10条:
# 命令:排序+取前10
sort -nr -k2 traffic.log | head -10
# 结果:直接输出带宽最高的10个IP,用于定位流量大户
192.168.2.5 980
192.168.2.12 850
案例2:按端口号排序,整理H3C交换机开放端口列表
# 日志内容示例:
GigabitEthernet0/24 8080
GigabitEthernet0/1 22
GigabitEthernet0/24 8080
# 命令:去重+按端口(第2列)数字排序
sort -u -k2n port.cfg
# 结果:
GigabitEthernet0/1 22
GigabitEthernet0/24 8080
案例3:按日期排序,整理迪普防火墙按天归档的日志
防火墙日志文件按“log_20251201.log”“log_20251130.log”命名,需按日期升序排列:
# 命令:按文件名第5-12位(日期字段)排序
ls log_*.log | sort -k1.5,1.12n
# 结果:按日期从早到晚排列日志文件,方便按顺序分析
log_20251130.log
log_20251201.log
案例4:按多字段排序,分析网络延迟数据
延迟日志(delay.log)格式: IP 区域 延迟(ms) ,需先按“区域”升序,同区域按“延迟”降序:
# 命令:先按第2列(区域)字母排序,再按第3列(延迟)数字反向排序
sort -k2,2 -k3,3nr delay.log
# 结果:
192.168.1.3 北京 60
192.168.1.5 北京 45
192.168.2.2 上海 75
案例5:处理CSV格式巡检数据,按丢包率排序
巡检数据(check.csv)格式: 设备IP,设备型号,丢包率(%) ,需按丢包率降序:
# 命令:指定逗号为分隔符,按第3列(丢包率)数字排序
sort -t ',' -k3nr check.csv -o sorted_check.csv
# 结果:输出到新文件,丢包率最高的设备排在最前,优先处理
10.0.0.8,迪普FW1000,2.5
10.0.0.3,H3C S5800,1.2
常见问题与避坑指南
1. 数字排序变字符排序:未加 -n 选项,导致“100”<“20”,需用 sort -n 。
2. 输出覆盖原文件:直接用 sort file > file 会清空原文件,必须用 sort file -o file 。
3. 多列排序跨列混乱:未指定列范围(如 -k2 会从第2列到行尾排序),需用 -k2,2 仅对第2列排序。
4. 重复行未去除: -u 需配合排序键值,若仅想按整行去重,直接用 sort -u ;按指定列去重,需先按该列排序再去重( sort -k2n -u )。
uniq - 去除重复项
基本语法
uniq 命令用于过滤或报告相邻的重复行。这是理解 uniq 的关键点——它只处理相邻的重复行。
uniq [选项] [输入文件] [输出文件]
常用选项详解
1. 基础选项
选项 说明
选项-c 在每行前显示重复次数
选项-d 只显示重复行(每组合并显示一次)
选项-D 显示所有重复行
选项-u 只显示不重复的行
选项-i 忽略大小写
选项-f N 跳过前 N 个字段进行比较
选项-s N 跳过前 N 个字符进行比较
选项-w N 只比较每行的前 N 个字符
重要前提:必须先排序
由于 uniq 只处理相邻重复行,通常需要先使用 sort 命令排序:
# ❌ 错误:未排序的文件可能漏掉重复行
cat file.txt | uniq
# ✅ 正确:先排序
sort file.txt | uniq
实用示例
echo -e "apple\nbanana\napple\norange\nbanana\napple" > fruits.txt
# 直接使用 uniq(可能无效,因为重复不相邻)
uniq fruits.txt
# 输出:
# apple
# banana
# apple
# orange
# banana
# apple
# 先排序再去重
sort fruits.txt | uniq
# 输出:
# apple
# banana
# orange
2. 统计重复次数
# 统计每个元素的出现次数
sort fruits.txt | uniq -c
# 输出:
# 3 apple
# 2 banana
# 1 orange
# 按次数排序(从多到少)
sort fruits.txt | uniq -c | sort -nr
# 输出:
# 3 apple
# 2 banana
# 1 orange
3. 查找重复行
# 只显示重复的行(每组合并显示一次)
sort fruits.txt | uniq -d
# 输出:
# apple
# banana
# 显示所有重复的行
sort fruits.txt | uniq -D
# 输出:
# apple
# apple
# apple
# banana
# banana
4. 查找唯一行
# 只显示不重复的行
sort fruits.txt | uniq -u
# 输出:
# orange
高级用法
1. 基于字段去重
# 创建包含多个字段的测试文件
echo -e "1 apple red\n2 banana yellow\n3 apple red\n4 orange orange" > data.txt
# 跳过第一个字段进行比较
sort data.txt | uniq -f 1
# 输出(基于第2、3字段去重):
# 1 apple red
# 2 banana yellow
# 4 orange orange
2. 基于字符位置去重
# 创建测试数据
echo -e "apple123\napple456\nbanana123\norange789" > codes.txt
# 只比较前5个字符
sort codes.txt | uniq -w 5
# 输出:
# apple123
# banana123
# orange789
# 跳过前5个字符进行比较
sort codes.txt | uniq -s 5
3. 忽略大小写
echo -e "Apple\napple\nAPPLE\nBanana\nbanana" > mixed.txt
# 区分大小写(默认)
sort mixed.txt | uniq
# 输出:
# APPLE
# Apple
# Banana
# apple
# banana
# 忽略大小写
sort mixed.txt | uniq -i
# 输出:
# Apple
# Banana
4. 处理带空格的字段
# 使用 -t 指定字段分隔符(通常与 sort 配合)
echo -e "John Smith:30\nJane Doe:25\nJohn Smith:30" > people.txt
sort -t ':' -k1,1 people.txt | uniq
# 输出:
# Jane Doe:25
# John Smith:30
# John Smith:30 # 注意:仍被视为重复,因为整行相同
实际应用场景
# 统计访问最频繁的IP地址
cat access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -10
# 输出:
# 1504 192.168.1.100
# 892 192.168.1.101
# 567 192.168.1.102
# 查找重复的错误信息
grep "ERROR" app.log | sort | uniq -c | sort -nr
2. 文本处理
# 清理重复的单词列表
sort wordlist.txt | uniq > cleaned_wordlist.txt
# 生成单词频率表
tr ' ' '\n' < document.txt | sort | uniq -c | sort -nr > word_freq.txt
3. 数据分析
# CSV文件去重
cut -d',' -f1 data.csv | sort | uniq -c
# 查找重复的用户名
awk -F',' '{print $2}' users.csv | sort | uniq -d
4.系统管理
# 查找重复的进程
ps aux | awk '{print $11}' | sort | uniq -d
# 检查重复的软件包
dpkg -l | awk '{print $2}' | sort | uniq -d
与 sort 命令的组合技巧
1. 排序并去重(最常用)
sort file.txt | uniq > unique.txt
2. 多字段排序去重
# 按第2列排序,基于第1列去重
sort -k2,2 file.txt | uniq -f1
3. 反向排序去重
sort -r file.txt | uniq
4. 数值排序去重
sort -n numbers.txt | uniq
wc - 统计文件
基本语法
wc [选项] [文件...]
常用选项
选项 说明
选项-c 统计字节数
选项-m 统计字符数(在多字节字符中与字节数不同)
选项-w 统计单词数
选项-l 统计行数
选项-L 显示最长行的长度
无选项 默认显示行数、单词数、字节数
各选项详解
统计字节数 (-c)
echo "Hello" | wc -c
# 输出:6(包括换行符)
# 创建文件测试
echo -n "Hello" > hello.txt # -n 不添加换行符
wc -c hello.txt
# 输出:5
统计字符数 (-m)
# 对于ASCII字符,-c 和 -m 相同
echo "Hello" | wc -m
# 输出:6
# 对于多字节字符(如中文)
echo "你好" | wc -m
# 输出:3(2个中文字符 + 换行符)
echo "你好" | wc -c
# 输出:7(UTF-8编码下每个中文字符3字节)
统计单词数 (-w)
echo "Hello World, this is a test." | wc -w
# 输出:6
# 单词定义:由空格、制表符或换行符分隔的字符串
统计行数 (-l)
echo -e "Line1\nLine2\nLine3" | wc -l
# 输出:3
# 统计源代码行数
wc -l *.py
显示最长行长度 (-L)
echo -e "short\nvery long line here\nmedium" | wc -L
# 输出:19("very long line here"的长度)
基本用法示例
基本用法示例
1. 默认统计(行数、单词数、字节数)
# 创建测试文件
echo -e "Hello World\nThis is Linux\nWC command test" > test.txt
# 默认统计
wc test.txt
# 输出:3 8 45 test.txt
# 解释:3行 8个单词 45字节 文件名
2. 统计多个文件
wc file1.txt file2.txt
# 输出:
# 10 50 400 file1.txt
# 20 100 800 file2.txt
# 30 150 1200 total
3. 从标准输入读取
echo "Hello World" | wc
# 输出:1 2 12
# 解释:1行 2个单词 12字节
# 多行输入
cat <<EOF | wc
Line 1
Line 2
Line 3
EOF
# 输出:3 6 24
实际应用场景
1. 代码统计
# 统计Python项目代码行数
wc -l *.py
# 统计所有源代码文件
find . -name "*.py" -o -name "*.js" -o -name "*.html" | xargs wc -l
# 排除空行和注释
grep -v '^$\|^#' script.py | wc -l
2. 日志分析
# 统计日志文件行数
wc -l /var/log/syslog
# 按日期统计日志条目数
grep "2024-01-15" /var/log/auth.log | wc -l
# 统计错误数量
grep -i "error" app.log | wc -l
3. 文本处理
# 统计文档单词数
wc -w document.txt
# 统计书籍章节平均长度
wc -w chapter*.txt
# 检查文件大小
wc -c large_file.iso
4. 系统监控
# 统计当前进程数
ps aux | wc -l
# 统计用户数
who | wc -l
# 统计网络连接数
netstat -an | wc -l
组合使用技巧
1. 与 find 命令结合
# 统计目录下所有txt文件的总行数
find . -name "*.txt" -exec wc -l {} +
# 统计每个文件并显示总计
find . -type f -name "*.md" | xargs wc -l
2. 与 grep 命令结合
# 统计包含特定模式的行数
grep "error" logfile.txt | wc -l
# 统计不同IP的访问次数
awk '{print $1}' access.log | sort | uniq -c | wc -l
3. 与 awk 命令结合
# 使用awk实现类似功能
awk 'END {print NR, NF, length}' file.txt
# NR: 行数, NF: 每行字段数, length: 行长(最后一行)
# 统计非空行
awk 'NF > 0 {count++} END {print count}' file.txt
4. 管道中的使用
# 统计当前目录文件数
ls -l | wc -l
# 统计单词频率
tr ' ' '\n' < document.txt | sort | uniq -c | wc -l
# 统计唯一单词数
tr '[:space:]' '\n' < text.txt | tr '[:upper:]' '[:lower:]' | sort -u | wc -l
tr - 转换或删除字符
基本语法
tr [选项] SET1 [SET2]
常用选项
选项 说明
选项-c 使用 SET1 的补集
选项-d 删除 SET1 中的字符
选项-s 压缩重复字符为单个字符
选项-t 截断 SET1,使其长度与 SET2 相同
字符集表示法
1. 普通字符
tr 'a' 'A' # 小写a转换为大写A
tr 'abc' 'ABC' # a→A, b→B, c→C
2. 范围表示
tr 'a-z' 'A-Z' # 所有小写字母转大写
tr '0-9' '9-0' # 数字反转:0→9, 1→8, ...
3. 特殊序列
\\ # 反斜杠
\a # 响铃
\b # 退格
\f # 换页
\n # 换行
\r # 回车
\t # 水平制表符
\v # 垂直制表符
[:alnum:] # 字母和数字
[:alpha:] # 字母
[:blank:] # 空格和制表符
[:cntrl:] # 控制字符
[:digit:] # 数字
[:graph:] # 可打印字符(不包括空格)
[:lower:] # 小写字母
[:print:] # 可打印字符(包括空格)
[:punct:] # 标点符号
[:space:] # 空白字符
[:upper:] # 大写字母
[:xdigit:] # 十六进制数字
基本用法示例
1. 字符转换
# 小写转大写
echo "hello world" | tr 'a-z' 'A-Z'
# 输出:HELLO WORLD
# 大小写互换
echo "Hello World" | tr 'a-zA-Z' 'A-Za-z'
# 输出:hELLO wORLD
# 替换特定字符
echo "apple,banana,orange" | tr ',' '\n'
# 输出:
# apple
# banana
# orange
2. 删除字符 (-d)
# 删除数字
echo "abc123def456" | tr -d '0-9'
# 输出:abcdef
# 删除标点符号
echo "Hello, World!" | tr -d '[:punct:]'
# 输出:Hello World
# 删除空白字符
echo -e "Hello\tWorld\nTest" | tr -d '[:space:]'
# 输出:HelloWorldTest
3. 压缩字符 (-s)
# 压缩多个空格为单个空格
echo "Hello World Test" | tr -s ' '
# 输出:Hello World Test
# 压缩重复字母
echo "aaabbbccc" | tr -s 'abc'
# 输出:abc
# 压缩换行符
echo -e "Line1\n\n\nLine2\n\nLine3" | tr -s '\n'
# 输出:
# Line1
# Line2
# Line3
4. 补集操作 (-c)
# 删除所有非数字字符
echo "abc123def456" | tr -cd '0-9'
# 输出:123456
# 保留字母,删除其他
echo "Hello, 123 World!" | tr -cd '[:alpha:][:space:]'
# 输出:Hello World
高级用法
1. 字符映射转换
# ROT13加密(字母旋转13位)
echo "hello world" | tr 'a-zA-Z' 'n-za-mN-ZA-M'
# 输出:uryyb jbeyq
# 解密ROT13
echo "uryyb jbeyq" | tr 'a-zA-Z' 'n-za-mN-ZA-M'
# 输出:hello world
# 简单的加密(字母移位)
echo "secret" | tr 'a-z' 'f-za-e'
# 输出:xjhwjy
2. 字符删除和压缩组合
# 清理文本:删除标点,压缩空格,转大写
echo "Hello,,, World!! Test..." | tr -d '[:punct:]' | tr -s ' ' | tr 'a-z' 'A-Z'
# 输出:HELLO WORLD TEST
# 标准化空白字符(所有空白转为空格)
echo -e "Hello\t\tWorld\n\nTest" | tr '[:space:]' ' ' | tr -s ' '
# 输出:Hello World Test
3. 使用字符类
# 所有数字转成0
echo "abc123def456" | tr '[:digit:]' '0'
# 输出:abc000def000
# 所有非字母字符转空格
echo "Hello,123-World!" | tr -c '[:alpha:]' ' '
# 输出:Hello World
# 然后压缩空格
echo "Hello,123-World!" | tr -c '[:alpha:]' ' ' | tr -s ' '
# 输出:Hello World
实际应用场景
1. 文本处理
# 统计单词数(将非字母字符转为换行)
echo "Hello, world! This is a test." | tr -c '[:alpha:]' '\n' | grep -v '^$' | wc -l
# 输出:6
# 提取所有单词(每行一个)
echo "Hello, world! Test-123" | tr -c '[:alpha:]' '\n' | grep -v '^$'
# 输出:
# Hello
# world
# Test
2. 数据处理
# CSV转TSV(逗号转制表符)
echo "name,age,city" | tr ',' '\t'
# 输出:name age city
# 清理电话号码
echo "Tel: (123) 456-7890" | tr -cd '0-9'
# 输出:1234567890
3. 系统管理
# 生成随机密码(8位字母数字)
cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 8 | head -1
# 清理日志时间戳
echo "[2024-01-15 10:30:45] ERROR: Something" | tr -d '[]'
# 输出:2024-01-15 10:30:45 ERROR: Something
4. 文件处理
# 将DOS换行符(CRLF)转Unix换行符(LF)
tr -d '\r' < dosfile.txt > unixfile.txt
# 删除文件中的空行
tr -s '\n' '\n' < file.txt > newfile.txt
xargs - 管道命令_构造参数
xargs 是Linux中常用的命令,主要作用是将前一个命令的输出作为参数,传递给后一个命令执行,常和 find 等命令配合使用。
选项-d 为输入指定一个定制的分割符, 默认分隔符是空格
选项-i 用 {} 代替 传递的数据
选项-I string 用string来代替传递的数据-n[数字] 设置每次传递几行数据
选项-n 选项限制单个命令行的参数个数
选项-t 显示执行详情
选项-p 交互模式
选项-P n 允许的最大线程数量为n
选项-s[大小] 设置传递参数的最大字节数(小于131072字节)
选项-x 大于 -s 设置的最大长度结束 xargs命令执行
选项-0 --null项用null分隔, 而不是空白, 禁用引号和反斜杠处理
举例:
xargs < file.txt #将file.txt内容单行打印
xargs -n 2 < file.txt #将file.txt内容打印,每行只输出两个数据
xargs -d "," -n 2 < file.txt #以","为分割符号,将file.txt内容打印,每行只输出两个数据
find ./ -name "[1-9]*.txt" | xargs -i mv {} ./dir1/ #查找当前目录下以数字开头的 .txt 文件,并移动到 ./dir1/ 目录
find ./dir1 -name "[1-9]*.txt" | xargs -I alltxt mv alltxt ./ #查找 ./dir1 目录下以数字开头的 .txt 文件,并将这些文件移动到当前目录
ln - 创建链接
1. 什么是 ln 命令?
ln 是 Linux 和 Unix-like 系统中用于创建链接 的命令。链接可以理解为一个文件的“快捷方式”,它允许你通过多个不同的路径名来访问同一个文件内容
2. 链接的类型
ln 命令可以创建两种类型的链接:
硬链接
· 概念:硬链接是原始文件的一个别名。它与原始文件共享相同的 inode 和数据块。从文件系统的角度来看,硬链接和原始文件是完全平等的,它们都是指向同一片物理数据的入口。
· 特点:
· 无法为目录创建硬链接(除非是超级用户在某些特定文件系统下,如 . 和 .. 就是系统自带的硬链接)。
· 无法跨越不同的文件系统或磁盘分区,因为 inode 编号在文件系统内是唯一的。
· 删除原始文件或任何一个硬链接,只要还有一个链接存在,文件数据就不会被真正删除。只有当一个文件的所有硬链接都被删除后,其 inode 和数据块才会被释放。
· 所有硬链接的文件大小、权限、所有者等信息都是完全相同的。
软链接
· 概念:软链接(也称为符号链接,Symbolic Link)是一个特殊的文件,这个文件里面存储的是另一个文件的路径。它类似于 Windows 系统中的快捷方式。
· 特点:
· 可以指向目录。
· 可以跨越不同的文件系统和磁盘分区。
· 如果原始文件被删除或移动,软链接就会“断裂”,成为“悬空链接”,访问它会报错 “No such file or directory”。
· 软链接文件有自己的 inode,其文件大小很小,就是它指向的路径名的字符长度。
· 权限通常是 rwxrwxrwx,但实际权限由原始文件决定。
3. 命令语法
```bash
ln [选项]... [-T] 源文件 目标链接名
ln [选项]... 源文件... 目标目录
ln [选项]... -t 目标目录 源文件...
4. 常用选项
选项 全称 描述
-s --symbolic 创建软链接。这是最常用的选项。
-f --force 强制创建。如果目标链接名已存在,则覆盖它。
-i --interactive 交互模式。如果目标链接名已存在,会询问是否覆盖。
-v --verbose 详细信息模式。显示操作过程的详细信息。
-n --no-dereference 当目标是目录的软链接时,将其视为普通文件。
-b --backup 覆盖文件前进行备份。
--backup=CONTROL 指定备份方式,如 numbered, existing, simple。
-t DIR --target-directory=DIR 指定目标目录,适用于一次性创建多个链接。
-r --relative 创建相对路径的软链接,而不是绝对路径。这在打包或移动目录结构时非常有用。
gzip - 压缩
gzip命令
要说tar命令是个纸箱子用于打包,gzip命令就是压缩机器
gzip通过压缩算法Lempel-Ziv 算法(LZ77)将文件压缩为较小文件,节省60%以上的存储空间,以及网络传输速率
命令格式
gzip(选项)(参数)
常用选项
选项 含义
选项-a或——ascii 使用ASCII文字模式
选项-c或——stdout或——to-stdout 把解压后的文件输出到标准输出设备
选项-d或——decompress或——uncompress 解压压缩文件
选项-f或——force 强行压缩文件。不理会文件名称或连接是否存在以及该文件是否为符号连接
选项-h或——help 在线帮助
选项-l或——list 列出压缩文件的相关信息
选项-L或——license 显示版本与版权信息
选项-n或——no-name 压缩文件时,不保存原来的文件名称及时间戳记
选项-N或——name 压缩文件时,保存原来的文件名称及时间戳记
选项-q或——quiet 不显示警告信息
选项-r或——recursive 递归处理,将指定目录下的所有文件及子目录一并处理
选项-S或<压缩字尾字符串>或——suffix<压缩字尾字符串> 更改压缩字尾字符串
选项-t或——test 测试压缩文件是否正确无误
选项-v或——verbose 显示指令执行过程
选项-V或——version 显示版本信息
<压缩效率> 压缩效率是一个介于1~9的数值,预设值为“6”,指定愈大的数值,压缩效率就会愈高
选项--best 此参数的效果和指定“-9”参数相同
选项--fast 此参数的效果和指定“-1”参数相同
案例
1#压缩目录中每一个html文件为.gz,文件夹无法压缩,必须先tar打包
gzip *.html
#gzip压缩,解压都会删除源文件
列出压缩文件中信息
gzip套件提供了许多方便的工具命令,可以直接操作压缩文件内容
zcat,直接读取压缩文件内容zcat hehe.txt.gz
zgrep
zless
zdiff
zip - 压缩
1. 什么是 zip?
zip 是一个用于创建压缩归档文件的命令行工具。与 tar 不同,zip 同时完成了打包和压缩两个步骤。它创建的 .zip 文件是最常见的压缩格式之一,尤其在与 Windows 系统交互时。
2. 命令语法
```bash
zip [选项] 压缩包名.zip [文件或目录...] [-x 排除文件] [-i 包含文件]
3. 核心选项
基本操作选项
选项 描述
选项-r 递归处理。压缩目录及其所有子目录和文件。这是压缩目录时必须的选项。
选项-q 安静模式。不显示指令执行过程。
选项-v 详细模式。显示压缩过程的详细信息。
选项-m 移动文件。将文件压缩后,删除原始文件。
选项-f ** freshen**。只更新压缩包中已存在的文件,不添加新文件。
选项-u 更新。更新压缩包中的文件(如果文件较新则更新),并添加新文件。
选项-d 删除。从压缩包中删除指定文件。
选项-e 加密。压缩时对文件进行加密,会提示输入密码。
选项-T 测试。测试压缩包是否完整无损。
压缩级别选项
选项 描述
选项-0 不压缩。仅存储文件,速度最快。
选项-1 最快压缩。压缩率最低。
选项-6 默认级别。平衡了速度和压缩率。
选项-9 最佳压缩。压缩率最高,但速度最慢。
文件选择选项
选项 描述
选项-x 排除文件。指定不压缩的文件或模式。
选项-i 包含文件。只压缩指定的文件或模式。
选项-@ 从标准输入读取文件列表。
使用方法与实例
假设我们有以下文件结构:
project/
├── src/
│ ├── main.py
│ └── utils.py
├── docs/
│ └── readme.txt
├── temp.log
└── config.ini
1. 基本压缩
```bash
# 压缩单个文件
zip archive.zip file1.txt
# 压缩多个文件
zip archive.zip file1.txt file2.txt config.ini
# 压缩目录(必须使用 -r 递归)
zip -r project.zip project/
# 压缩当前目录下所有文件
zip -r all_files.zip ./*
2. 压缩级别控制
```bash
# 最快压缩(压缩率低)
zip -r -1 fast.zip project/
# 最佳压缩(压缩率高,速度慢)
zip -r -9 best.zip project/
# 默认压缩(平衡)
zip -r normal.zip project/
3. 排除文件
```bash
# 排除特定文件
zip -r project.zip project/ -x "*.log"
# 排除多个模式
zip -r project.zip project/ -x "*.log" "*.tmp" "*/cache/*"
# 排除特定目录
zip -r project.zip project/ -x "project/temp/*"
# 只包含特定文件类型
zip -r images.zip . -i "*.jpg" "*.png" "*.gif"
4. 加密压缩
```bash
# 创建加密的压缩包(会提示输入密码)
zip -r -e secret_project.zip project/
# 在脚本中使用(不推荐,密码会出现在历史记录中)
zip -r -e -P your_password secret.zip project/
5. 更新和修改压缩包
```bash
# 向现有压缩包添加新文件
zip existing.zip new_file.txt
# 更新压缩包中的文件(只有更新的文件会被重新压缩)
zip -r -u project.zip project/
# 从压缩包中删除文件
zip -d project.zip "*.log"
# 只更新压缩包中已存在的文件
zip -r -f project.zip project/
6. 其他实用操作
```bash
# 安静模式压缩(适用于脚本)
zip -r -q quiet.zip project/
# 详细模式(显示每个文件的压缩信息)
zip -r -v verbose.zip project/
# 压缩后删除原文件
zip -r -m moved.zip project/ # 压缩后 project/ 目录会被删除
# 测试压缩包完整性
zip -T archive.zip
# 输出: test of archive.zip OK
# 从文件列表读取要压缩的文件
find . -name "*.txt" | zip -@ textfiles.zip
查看和管理 ZIP 文件
5. 查看和管理 ZIP 文件
使用 unzip 命令查看内容
```bash
# 查看压缩包内容(不解压)
unzip -l archive.zip
# 查看详细信息(大小、日期、压缩率等)
unzip -v archive.zip
# 测试压缩包完整性
unzip -t archive.zip
使用 zipinfo 命令
```bash
# 查看压缩包详细信息
zipinfo archive.zip
# 简要列表
zipinfo -1 archive.zip
# 详细列表(类似 ls -l)
zipinfo -l archive.zip
tar - 归档打包
1. 什么是 tar?
tar 的全称是 Tape Archiver(磁带归档器)。它的核心功能是:
1. 打包:将多个文件或目录合并成一个单一的归档文件(称为 tarball),后缀为 .tar。
2. 压缩/解压:结合压缩程序(如 gzip, bzip2, xz)对这个打包文件进行压缩,生成如 .tar.gz, .tar.bz2, .tar.xz 等文件。
关键概念:tar 本身只负责打包,不负责压缩。压缩是通过管道传递给其他程序(如 gzip)完成的。这就是为什么它的选项可以如此灵活地结合各种压缩工具。
2. 命令语法
```bash
tar [模式选项] [其它选项] [归档文件名] [要操作的文件或目录...]
3. 核心模式选项(必须指定一个)
选项 长选项 模式 描述
-c --create 创建模式 创建新的归档文件。
-x --extract 提取模式 从归档文件中解包文件。
-t --list 列表模式 列出归档文件中的内容,不解包。
-r --append 追加模式 向已存在的归档文件末尾追加文件。
-u --update 更新模式 仅追加比归档中同名文件更新的文件。
-A --catenate 合并模式 将一个 tar 文件追加到另一个 tar 文件末尾。
4. 常用辅助选项
选项 长选项 描述
-f --file 指定归档文件名。这是最重要的选项之一,几乎总是必须的。
-v --verbose 详细模式。显示正在处理的文件列表。
-z --gzip 通过 gzip 进行压缩或解压。处理 .tar.gz 或 .tgz 文件。
-j --bzip2 通过 bzip2 进行压缩或解压。处理 .tar.bz2 或 .tbz2 文件。
-J --xz 通过 xz 进行压缩或解压。处理 .tar.xz 或 .txz 文件。
-C --directory 改变至目录。在解压时特别有用,指定解压到的目标目录。
-P --absolute-names 保留绝对路径。默认会去掉路径开头的 /,出于安全考虑。谨慎使用!
--exclude=PATTERN 排除匹配模式的文件或目录。
-h --dereference 跟随符号链接(归档链接指向的实际文件,而不是链接本身)。
--wildcards 在提取或列表时允许使用通配符。
--strip-components=N 提取时去除路径中的前 N 级目录。
-k --keep-old-files 提取时不覆盖已存在的文件。
--overwrite 提取时覆盖已存在的文件。
-W --verify 写入归档后进行验证。
-a --auto-compress 根据归档文件的后缀名自动选择压缩方式。
5. 压缩格式对比
格式 选项 常见后缀 压缩率 速度 适用场景
不压缩 (无) .tar 0% 最快 仅打包,或速度绝对优先
gzip -z .tar.gz, .tgz 中等 快 最通用,平衡了速度和压缩率
bzip2 -j .tar.bz2, .tbz2 高 慢 需要较高压缩率,不介意时间
xz -J .tar.xz, .txz 非常高 最慢 需要极致压缩率(如软件发行包)
现代简化 -a (根据后缀自动判断) (自动选择) (自动选择) 推荐使用,更简洁
6. 使用方法与实例详解
假设我们有以下文件结构:
project/
├── src/
│ ├── main.py
│ └── utils.py
├── docs/
│ └── manual.txt
├── data.csv
└── README.md
1. 创建归档(打包与压缩)
```bash
# 1. 仅打包,不压缩
tar -cf project.tar project/
# 2. 打包并用 gzip 压缩 (最常用)
tar -czf project.tar.gz project/
# 3. 打包并用 bzip2 压缩
tar -cjf project.tar.bz2 project/
# 4. 打包并用 xz 压缩
tar -cJf project.tar.xz project/
# 5. 使用自动压缩(根据后缀名)
tar -caf project.tar.gz project/ # 等同于 -czf
tar -caf project.tar.xz project/ # 等同于 -cJf
# 6. 打包时显示详细文件列表 (-v)
tar -czvf project.tar.gz project/
# 输出: project/
# project/src/
# project/src/main.py
# project/src/utils.py
# ...
# 7. 打包当前目录下所有文件
tar -czf backup.tar.gz ./*
# 8. 打包时排除某些文件
tar -czf project.tar.gz --exclude='*.tmp' --exclude='cache/*' project/
# 9. 跟随符号链接(归档实际文件内容)
tar -czhf archive_with_links.tar.gz my_directory/
2. 列出归档内容
```bash
# 1. 简单列出归档中的所有文件
tar -tf project.tar.gz
# 2. 详细列出(显示文件权限、大小、时间等信息)
tar -tvf project.tar.gz
# 输出: drwxr-xr-x user/user 0 2023-10-01 12:00 project/
# -rw-r--r-- user/user 1024 2023-10-01 12:00 project/README.md
# ...
# 3. 在详细列表中使用 grep 过滤
tar -tvf project.tar.gz | grep '\.py$'
3. 提取归档(解包)
```bash
# 1. 解压到当前目录
tar -xf project.tar
# 2. 解压 .tar.gz 到当前目录
tar -xzf project.tar.gz
# 3. 解压并显示详细文件列表
tar -xzvf project.tar.gz
# 4. 解压到指定目录 (-C)
tar -xzf project.tar.gz -C /path/to/target/directory/
# 5. 只解压归档中的特定文件
tar -xzf project.tar.gz project/README.md # 只解压 README.md
tar -xzf project.tar.gz "*.py" # 只解压所有 .py 文件
tar -xzf project.tar.gz project/src/main.py # 只解压特定文件
# 6. 提取时不覆盖已存在的文件
tar -xzkf project.tar.gz
# 7. 提取时去除路径中的前 N 级目录
# 假设归档内路径是 project/src/main.py
tar -xzf project.tar.gz --strip-components=1
# 提取后路径变为: src/main.py
tar -xzf project.tar.gz --strip-components=2
# 提取后路径变为: main.py
4. 更新和修改归档
```bash
# 1. 向已存在的归档文件追加新文件(不能用于压缩的归档)
tar -rf project.tar new_file.txt
# 2. 更新归档中的文件(只有更新的文件会被重新压缩)
tar -uzf project.tar.gz project/
# 3. 从压缩包中删除文件(需要先解压、删除、再压缩,没有直接删除选项)
# 这是一个间接方法:
tar -f project.tar --delete file_to_remove
# 注意:--delete 不能用于压缩的归档
# 4. 合并两个 tar 文件
tar -Af archive1.tar archive2.tar
7. 高级用法与实用技巧
场景1:增量备份
```bash
# 创建完整备份
tar -czg snapshot.file -f full_backup.tar.gz /data
# 创建增量备份(只备份自上次以来更改的文件)
tar -czg snapshot.file -f incremental_backup.tar.gz /data
场景2:通过网络传输
```bash
# 一边打包压缩,一边通过 ssh 传输到远程服务器
tar -czf - /local/directory | ssh user@remote_host "tar -xzf - -C /remote/directory"
# 从远程服务器获取文件并解压
ssh user@remote_host "tar -czf - /remote/directory" | tar -xzf - -C /local/directory
场景3:创建带时间戳的备份
```bash
# 使用日期作为备份文件名的一部分
tar -czf backup_$(date +%Y%m%d_%H%M%S).tar.gz /important/data
# 每周备份
tar -czf backup_$(date +%Y-%U).tar.gz /home
场景4:验证归档完整性
```bash
# 创建时验证
tar -czWf project.tar.gz project/
# 提取前验证
tar -tzf project.tar.gz > /dev/null && echo "Archive is OK"
# 测试归档完整性
tar -df project.tar.gz # 将归档与文件系统比较
8. 重要注意事项
1. -f 选项的位置:-f 后面必须紧跟归档文件名。错误:tar -zcf project/ archive.tar.gz,正确:tar -zcf archive.tar.gz project/。
2. 绝对路径警告:默认情况下,tar 会移除路径开头的 /,将绝对路径变为相对路径,这是安全措施。使用 -P 可以保留绝对路径,但这可能导致解压时覆盖系统文件。
3. 压缩格式匹配:提取时使用的压缩选项应与创建时一致,或者使用自动检测(-a)或直接解压(-x 通常能自动检测)。
4. 权限问题:解压时需要目标目录的写权限。某些文件属性(如 SELinux 上下文)可能需要特殊选项才能保留。
9. 现代简化用法总结
# 创建压缩包
tar -czf 目标文件.tar.gz 源文件或目录
tar -cJf 目标文件.tar.xz 源文件或目录 # 更高压缩比
# 查看压缩包内容
tar -tzf 压缩包.tar.gz
# 解压压缩包
tar -xzf 压缩包.tar.gz
tar -xzf 压缩包.tar.gz -C 目标目录
tar 是 Linux 系统管理和开发的基石工具,熟练掌握它能极大提高工作效率。建议在实际操作中逐步尝试这些选项,加深理解。