04文件查找和压缩

📅 2026/7/1 2:53:13
04文件查找和压缩
本章目标掌握vim编辑器的基本使用【重点】掌握文件查找文件【重点】掌握字符处理的相关操作【难点】掌握常见压缩工具的使用【重点】本章内容一、vi和vim编辑器1、vi编辑器1.1、概述Vim文本编辑器是由 vi 发展演变过来的文本编辑器使用简单、功能强大、是 Linux 众多发行版的默认文本编辑器vivisual editor编辑器通常被简称为vi它是Linux和Unix系统上最基本的文本编辑器类似于Windows 系统下的notepad记事本编辑器Vim(Vi improved)是vi编辑器的加强版比vi更容易使用。vi的命令几乎全部都可以在vim上使用1.2、工作模式基本上vi有3种模式分别是普通模式、插入模式与命令模式。这三种模式的作用分别如下普通模式使用vim编辑文件时默认处于普通模式在此模式下可以使用上、下、左、右键或者k、j、h、i命令进行光标的移动还可以对文件内容进行复制、粘贴、替换、删除等操作插入模式在该模式下可以对文件的内容进行编辑进入到编辑模式的方式是i、a、o等插入命令编辑完成后按ESC键即可返回命令模式。命令模式:可以在末行输入命令来对文件进行查找、替换、保存、退出等操作在一般模式下输入:wq!保存后输入q!若曾经修改过又不想保存使用!为强制离开不保存文件。二、查找文件当在操作系统中要查找一个文件符合要求的文件的时候如果操作系统中的文件目录非常的复杂查找文件就变得非常重要1、find命令命令find 路径范围 选项1 选项1的值 [选项2 选项2 的值…]作用用于查找文档其选项有55 个之多选项-name按照文档名称进行搜索支持模糊搜索* 通配符匹配任意个任意字符-type按照文档的类型进行搜索文档类型的值ffile)表示文件d(directory)表示文件夹-size按照指定的文件大小查找文件(n 大于 -n小于 n等于,单位有k,M,G)-mtime根据文件修改时间搜索文件-empty:表示空在Linux中适用于文件目录和文件-delete该选项可以用来删除搜索到的文件和目录-exec该选项可以对搜索的结果执行特定的命令示例1# 在/root下查找名称是hello.txt的文件[rootgiles ~]# find /root -name hello.txt# 在/root目录下查找名称以h开头的txt文件[rootgiles ~]# find /root -name h*.txt#在/root目录下查找所有的文件夹[rootgiles ~]# find /root -type d#在/root目录下查找所有的文件[rootgiles ~]# find /root -type f#在/目录下查找超过50M的文件[rootgiles ~]# find / -size 50M示例如果你的文件名称中间有空格这样的特殊符号查找方法有两种#使用\进行转移[rootlocalhost ~]# find /root -name a\ b\ c#使用进行括起来作为一个整体[rootlocalhost ~]# find /root -name a b c示例2根据文件的修改时间搜索# 获取文件的状态这里可以获取文件最后修改时间 [rootgiles ~]# stat hello.txt #同时修改文件的修改时间与访问时间 [rootgiles ~]# touch -d 2024-07-01 13:01:02 hello.txt #只修改文件的修改时间 [rootgiles ~]# touch -m -d 2024-7-02 13:15:26 hello.txt #只修改文件的访问时间 [rootgiles ~]# touch -a -d 2024-7-03 13:15:26 hello.txt #-mtime根据文件最后修改时间搜索文件搜索3天以前的文件信息 [rootgiles ~]# find /root -name *.txt -mtime 3 -type f #-mtime根据文件最后修改时间搜索文件搜索3天以内的文件信息 [rootgiles ~]# find /root -name *.txt -mtime -3 -type f示例3#删除opt目录下所有的空目录[rootserver01 opt]# find /opt -type d -empty -delete#查找/root目录下的.txt扩展名的文件并删除[rootlocalhost ~]# find /root -name *.txt -exec rm {} \;示例4#将root家目录下又有jpg文件复制到/opt目录下[rootserver01 ~]# find /root -name *.jpg -exec cp {} /opt ;[rootserver01 ~]# find /root -name *.jpg -exec cp {} /opt \;2、locate命令locate 搜索文件作用locate指令可以快速定位文件路径locate指令利用事先建立的系统中所有文件名称及路径的locate数据库实现快速定位给定的文件。locate指令无需遍历整个文件系统查询速度较快为了保证查询的准确度管理员必须定期更新location时刻注意由于locate指令基于数据库进行查询所以第一次运行前必须使用updatedb指令创建locate数据库。示例[rootgiles ~]# updatedb[rootgiles ~]# locate hello.txt/root/hello.txt3、whichwhich命令用于在类似于 Unix 系统如 Linux 或 macOS中查找与指定命令相对应的可执行文件路径。它会在环境变量PATH所包含的目录中搜索如果找到对应的可执行文件就会输出其完整路径。[rootlocalhost ~]# which touch/usr/bin/touch[rootlocalhost ~]# which lsaliaslsls --colorauto/usr/bin/ls[rootlocalhost ~]# which lsaliaslsls --colorauto/usr/bin/ls[rootlocalhost ~]# which rmaliasrmrm -i/usr/bin/rm三、IO重定向和管道1、标准输出重定向场景一般命令的输出都会显示在终端中有些时候需要将一些命令的执行结果想要保存到文件中进行后续的分析/统计则这时候需要使用到的输出重定向技术。比如在find命令中我想统计”.log”结尾的文件数量一共有多少个。语法标准输出重定向 :覆盖输出会覆盖掉原先的文件内容追加重定向 :追加输出不会覆盖原始文件内容会在原始内容末尾继续添加命令有输出的命令 重定向符号 或者 文件名作用在文件中直接找到包含指定信息的那些行并把这些信息显示出来示例[rootgiles ~]# find / -name *.log -type f log.log2、标准错误重定向概念错误重定向是将命令执行过程中产生的错误信息stderr导向到指定位置的操作。在Linux中错误信息默认会输出到终端但可以通过重定向将其保存到文件或丢弃。基本错误重定向2: 将标准错误重定向到文件覆盖2: 将标准错误追加到文件[rootservere ~]# ls /aa/file 2/opt/1.txt[rootservere ~]# ls /aa/file2 2/opt/1.log合并重定向或: 同时重定向标准输出和标准错误21: 将标准错误重定向到标准输出12: 将标准输出重定向到标准错误#(1)分别将标准的正确输出到/data/stdout.log日志上将标准的错误输出到/data/stderr.log日志[rootservere ~]# ls /opt /opt1 1/data/stdout.log 2/data/stderr.log#(2)将标准输出和错误输出合并到同一个文件里[rootservere ~]# ls /opt /opt1 /data/all.log[rootservere ~]# ls /opt /opt1 /data/all1.log#(3)[rootservere data]# ls /opt /err 1/data/all.log 21[rootservere data]# ls /opt /err 2/data/all.log 12流行程度排序排名操作符流行程度说明121⭐⭐⭐⭐⭐最流行POSIX标准兼容性最好2⭐⭐⭐⭐较流行bash特有简洁明了3⭐⭐⭐一般流行功能与相同412⭐⭐较少使用特定场景3、标准输入重定向概念标准输入重定向是将命令的输入源从默认的键盘改为其他来源如文件、字符串等的操作。在Linux中标准输入的文件描述符为0。基本输入重定向: 将文件内容作为命令的标准输入: Here文档将多行文本作为输入: Here字符串将单行字符串作为输入[rootservere data]# wc -l/etc/profile76[rootservere data]# cat EOF这是第一行这是第二行这是第三行EOF[rootservere data]# wc -w hello giles4、管道符管道符|作用管道是一种通信机制通常用于进程间的通信。它表现出来的形式将前面每一个进程的输出stdout直接作为下一个进程的输入stdin示例显示/etc/passwd文件中的第5行到第8行的信息[rootserver data]# head -8 /etc/passwd | tail -4 | cat -n示例以翻页的形式显示/etc目录下的所有文件列表信息[gilesgiles ~]$ls-l/etc|less5、tee命令基本概念:tee命令用于从标准输入读取数据并同时将数据输出到标准输出和一个或多个文件中。它的名字来源于T型管道T-pipe的概念就像水流通过T型管道分流一样。基本语法tee[选项][文件...]常用选项-a,--append: 追加到文件而不是覆盖-i,--ignore-interrupts: 忽略中断信号如CtrlC-p: 诊断写入非管道时的错误--output-error[模式]: 设置写入错误时的行为基本用法# 基本用法显示并保存输出echoHello World|teeoutput.txt# 保存到多个文件ls-l|teefile1.txt file2.txt file3.txt# 追加模式date|tee-alogfile.txt# 将当前时间追加到logfile.txt而不是覆盖# 忽略中断信号command|tee-ioutput.txt# 即使按下CtrlC也会继续写入文件四、字符处理在昨天的作业中有这么一道题目假设有一个文件hello.txt该文件中有10行数据查找该文件中第五行到第八行的数据。要求是查找第五行到第八行的数据其实我们可以分为以下两个步骤进行获取前面八行的数据 head -8 hello.txt在前面命令得到的结果上获取后面4行的数据 tail -4 前面命令的结果前面八行数据也就是说此处需要执行两个命令前面命令执行的结果作为后面命令的输入数据1、使用grep搜索文本命令grep [选项] 查找内容 文件路径管道方式cat 文件路径 | grep [选项] 查找内容常用选项-n显示匹配行以及行号-i忽略字母大小写-c统计包含匹配的行数-v反向匹配-o: 整词匹配示例1为了演示grep的用法这里创建一个文件文件的内容如下[rootgiles ~]# cat tomAndJerry.txtThecats name is Tom,whatsthenmouses name? The mouses NAME is Jerry They are good friends2找出含有name的行[rootgiles ~]# grep name tomAndJerry.txtThecats name is Tom,whatsthenmouses name?找出含有name的行显示行号[rootgiles ~]# grep -n name tomAndJerry.txt1:Thecats name is Tom,whatsthenmouses name?4找出含有name的行忽略大小写[rootgiles ~]# grep -i name tomAndJerry.txtThecats name is Tom,whatsthenmouses name? The mouses NAME is Jerry5获取该文件中有多少含name的行[rootgiles ~]# grep -c name tomAndJerry.txt1[rootgiles ~]# grep -ic name tomAndJerry.txt26反向匹配[rootgiles ~]# grep -v name tomAndJerry.txtThe mouses NAME is Jerry They are good friends [rootgiles ~]# grep -iv name tomAndJerry.txt They are good friends[rootgiles ~]#如上已经学习了如何使用grep搜索文本信息下面可以使用管道符grep实现过滤功能示例1将last当中有出现root的那一行读出来[gilesgiles ~]$ last|greproot root pts/0192.168.253.1 Sat Jul613:12 - crash(03:24)root pts/0192.168.253.1 Sat Jul607:15 -10:48(03:33)示例2与示例1相反只要没有root的就读出来[gilesgiles ~]$ last|grep-vroot giles pts/0192.168.253.1 Sat Jul616:38 still loggedinrebootsystem boot3.10.0-957.el7.x Sat Jul616:37 -16:43(00:05)rebootsystem boot3.10.0-957.el7.x Sat Jul613:10 -16:43(03:33)2、使用cut截取文本语法: cut [选项] 文件或者操作目标选项-f 指定的列-d ‘分隔符’-c 指定列字符示例:认识账号的文件[gilesgiles ~]$cat/etc/passwd|greproot|cut-f1,5-d:root:root operator:operator示例将last列表中root账户信息筛选出来然后通过cut截取第1-4个字符和23-35个字符[gilesgiles ~]$ last|greproot root pts/0192.168.253.1 Sat Jul613:12 - crash(03:24)root pts/0192.168.253.1 Sat Jul607:15 -10:48(03:33)[gilesgiles ~]$ last|greproot|cut-c1-4,23-35 root192.168.253.1 root192.168.253.13、使用sort排序很多情况下需要对无序的数据进行排序这时就要用到sort排序了。下面列出了该命令常用的参数命令sort [参数] 文件名参数-n采取数字排序-t指定分隔符-k指定第几列-r反向排序为演示sort的用法这里首先创建一个文件文件名和文件内容如下[gilesgiles ~]$catsort.txt b:3 c:2 a:4 e:5 d:1 f:11使用sort进行排序:默认按照每行的第一个字符进行排序[gilesgiles ~]$catsort.txt|sorta:4 b:3 c:2 d:1 e:5 f:11对输出内容进行反向排序[gilesgiles ~]$catsort.txt|sort-rf:11 e:5 d:1 c:2 b:3 a:4用-t指定分隔符并用-k指定用于排序的列# 目前不是按照数字排序是按照第2列的第一个字符进行排序所以11在2之前[gilesgiles ~]$catsort.txt|sort-t:-k2d:1 f:11 c:2 b:3 a:4 e:5# 使用-n参数进行数字排序[gilesgiles ~]$catsort.txt|sort-t:-k2-nd:1 c:2 b:3 a:4 e:5 f:11如上是sort对于一个普通文本文件中内容的各种排序那么结合在实际中如何使用呢示例[gilesgiles ~]$cat/etc/passwd|sort#/etc/passwd内容以:来分隔的我想以第3列排序如下[gilesgiles ~]$cat/etc/passwd|sort-t:-k3#利用last将输出的数据仅取出账号并加以排序[gilesgiles ~]$ last|cut-f1-d |sort4、使用uniq删除重复内容命令:uniq [参数]参数-i忽略大小写-c计算重复行数示例unque删除重复文本的内容# 查看uniq.txt的内容[gilesgiles ~]$catuniq.txt abc123abc123abc123#这是因为uniq命令只会对比相邻的行如果有连续相同的若干行则删除重复内容仅输出一行。如果相同的行非连续则uniq命令不具备删除效果[gilesgiles ~]$catuniq.txt|uniqabc123abc123abc123# 使用sort排序后再使用uniq命令这时就达到了预期的效果。[gilesgiles ~]$catuniq.txt|sort|uniq123abc# 使用-c参数就会在每行前面打印该重复的次数[gilesgiles ~]$catuniq.txt|sort|uniq-c31233abc示例# 使用last将账号列出仅取出账号列进行排序后仅取出一位[gilesgiles ~]$ last|cut-d -f1|sort|uniqgilesrebootroot wtmp# 承上例如果想知道每个人的登录次数是多少如下所示[gilesgiles ~]$ last|cut-f1-d |sort|uniq-c16giles9reboot8root1wtmp5、使用wc统计文字如果想统计每个文件中有多少个字多少行多少个字符的话就可以使用wc这个命令来完成具体如下命令wc [参数]参数-l仅列出行-w仅列出多少字英文单字-m多少字符示例[gilesgiles ~]$cat/etc/profile|wc762531819# 输出三个数字中分别代表行、字节、字符数# 统计登录系统的总人数[gilesgiles ~]$ last|grep[a-zA-Z]|grep-vwtmp|wc-l236、xargs命令为什么需要xargs命令由于很多命令不支持|管道来传递参数而日常工作中有有这个必要所以就有了 xargs 命令示例#查找家目录下面所有包含a的日志文件以详细列表的形式打印出来find~-name*.log|grepa|ls-l# 该命令执行得不到预期的效果因为ll不支持管道命令find~-name*.log|grepa|xargsls-lxargs 可以将管道或标准输入stdin数据转换成命令行参数也能够从文件的输出中读取数据。xargs 也可以将单行或多行文本输入转换为其他格式例如多行变单行单行变多行。xargs 默认的命令是 echo这意味着通过管道传递给 xargs 的输入将会包含换行和空白不过通过 xargs 的处理换行和空白将被空格取代。xargs 是一个强有力的命令它能够捕获一个命令的输出然后传递给另外一个命令。示例[rootlocalhost ~]# find /root -name *.txt | xargs rm五、压缩和解压打包指的是一个文件或目录的集合而这个集合被存储在一个文件中。归档文件没有经过压缩占用的空间是其中所有文件和目录的总和。如a.txt 5M b.txt 5M c.txt 5M 打包之后的文件为abc.tar那么abc.tar的大小为15M压缩文件也是一个文件和目录的集合且这个集合也被存储在一个文件中但它们的不同之处在于压缩文件所占用的磁盘空间**比集合中所有文件大小的总和要小。abc.tar的大小为15M如果将abc.tar进行压缩为abc.tar.gz那么abc.tar.gz的大小是小于15M的**通俗的讲**打包是将多个文件放到一个文件中方便存储与传输压缩是为了减少文件的大小方便存储与传输1、gzip/gunzip指令1.1、gzip压缩命令:gzip [参数] 文件名参数-c将压缩的数据输出到屏幕上-v可以显示出原文件/压缩文件的压缩比等信息-#压缩等级-1最快但是压缩比最差-9最慢但是压缩比最好默认是-6示例# 使用gzip压缩文件[rootgiles ~]# gzip libxul.so# 使用gzip压缩文件显示压缩比信息[rootgiles ~]# gzip -v libxul.solibxul.so:58.5% -- replaced with libxul.so.gz# 用最佳压缩比压缩[rootgiles ~]# gzip -9 libxul.so1.2、gunzip解压-d解压缩的参数示例[rootgiles ~]# gunzip libxul.so.gz2、zip/unzip2.1、zip压缩命令:zip [参数] 压缩包名 源文件或源目录参数-r :递归压缩压缩目录示例#将hello.txt hi.txt log.log文件压缩成abc.zip文件[rootgiles ~]# zip abc.zip hello.txt hi.txt log.log#将目录压缩成tt.zip文件[rootgiles ~]# zip -r tt.zip tt2.2、unzip解压缩命令unzip作用兼容类unix与windows解压zip文件语法unzip 要解压的压缩文件 [-d] 解压目录# 将ttd.zip解压到当前目录[rootgiles ~]# unzip ttd.zip# 将tt.zip解压到test01目录下[rootgiles ~]# unzip tt.zip -d test013、bzip2压缩和解压bzip2是一个用于文件压缩的命令行工具它使用Burrows-Wheeler 算法基于块排序进行高效的数据压缩。通常用于替代gzip在需要更高压缩率时尤其有用。主要功能压缩文件将原始文件压缩为.bz2格式同时删除原文件。解压文件将.bz2文件解压回原始格式。支持多种选项如保留原文件、测试压缩文件完整性、指定压缩级别等。常用命令示例压缩文件bzip2filename.txt这会生成filename.txt.bz2并删除原始的filename.txt。解压文件bzip2-dfilename.txt.bz2或使用bunzip2命令bunzip2 filename.txt.bz2查看压缩文件内容不解压bzcat filename.txt.bz2保留原始文件bzip2-cfilename.txtfilename.txt.bz2指定压缩级别1~9bzip2-6filename.txt# 使用中等压缩级别特点优点压缩率高于gzip支持多线程压缩使用pbzip2变体。缺点压缩/解压速度较慢。占用内存较高。相关命令命令功能bzcat查看.bz2文件内容bzless,bzmore分页查看压缩文件内容bunzip2解压.bz2文件如需更高的压缩效率并接受较高的资源消耗bzip2是一个不错的选择。4、xz压缩和解压xz是一个用于文件压缩和解压的命令行工具它使用LZMA2压缩算法提供比gzip和bzip2更高的压缩率。适用于需要节省存储空间或减少传输体积的场景。主要功能压缩文件将文件压缩为.xz或.lzma格式。解压文件将.xz或.lzma文件还原为原始格式。支持多线程压缩通过--threads参数。可选保留原文件默认不保留原文件可通过参数控制。常用命令示例压缩文件xz filename.txt这会生成filename.txt.xz并删除原始文件。解压文件xz-dfilename.txt.xz查看压缩文件内容不解压xzcat filename.txt.xz保留原始文件xz-kfilename.txt指定压缩级别默认是6范围是0~9xz-9filename.txt# 最高压缩级别最慢但压缩率最高多线程压缩适合大文件xz-T4-9filename.txt# 使用4个线程进行压缩5、tar压缩和解压5.1、打包命令tar作用将多个文件打包成一个文件语法tar [选项] 打包文件名 要打包的文件或目录参数功能-c创建一个压缩包-v显示详情信息-z指定压缩(没有这个参数只是打包没有压缩)-f 压缩文件名指定压缩后文件名-uupdate缩写更新原打包文件中的文件了解-t查看打包的文件内容了解示例使用tar命令进行打包#将a.txtb.txtc.txt打包成为abc.tar[rootgiles ~]# tar -cvf abc.tar a.txt b.txt c.txt#将d.txt文件追加到abc.tar包中[rootgiles ~]# tar -uf abc.tar d.txt# 查看abc.tar包中的内容[rootgiles ~]# tar -tf abc.tara.txt b.txt c.txt d.txt5.2、打包并压缩Linux下常用的压缩工具有很多比如 gzip、zip、bzip2、xz 等 tar 在打包的时候是支持压缩的gzip 、bzip2 、xz 压缩工具都可以在 tar 打包文件中使用扩展名分类.zip或.rarwindows下常见的压缩格式.tarLinux打包文件.gzLinux压缩文件.tar.gz打包并压缩的文件语法tar [参数] 压缩包名 一个或多被打包的文件功能-z指定压缩压缩为.gz格式这种格式在工作中是最常用的-j压缩为.bz2格式-J压缩为.xz格式-x解压缩与-c的作用相反压缩tar文件#将a.txtb.txtc.txt,d.txt打包并压缩为abc.tar.gz[rootgiles ~]# tar -zcvf abc.tar.gz a.txt b.txt c.txt d.txt#将a.txtb.txtc.txt,d.txt打包并压缩为abc.tar.bz2[rootgiles ~]# tar -jcvf abc.tar.bz2 a.txt b.txt c.txt d.txt#将a.txtb.txtc.txt,d.txt打包并压缩为abc.tar.xz[rootgiles ~]# tar -Jcvf abc.tar.xz a.txt b.txt c.txt d.txt[rootgiles ~]# ll总用量24-rw-r--r--.1root root1487月621:36 abc.tar.bz2 -rw-r--r--.1root root1487月621:35 abc.tar.gz -rw-r--r--.1root root1887月621:36 abc.tar.xz压缩格式描述压缩率压缩/解压速度企业使用频率.tar.gz使用 Gzip 压缩中等快高.tar.bz2使用 Bzip2 压缩较高慢中等.tar.xz使用 XZ 压缩基于 LZMA/LZMA2 算法最高最慢低至中等说明.tar.gz由于压缩比和速度之间取得了较好的平衡是目前最常用的一种格式。广泛用于各种 Linux 发行版和企业环境。.tar.bz2相比 Gzip 能提供更好的压缩效果但需要更多的 CPU 资源压缩和解压速度较慢。在对速度要求不高的场景中使用。.tar.xz提供最高的压缩率适合对存储空间要求较高的情况但压缩和解压过程非常慢因此在企业中的使用频率相对较低。5.3、解压缩解压的时候把压缩命令中的 c 换成 x即可#解压abc.tar.gz到当前目录如果当前目录中有相同文件会被覆盖[rootgiles ~]# tar -xvf abc.tar.gz#将abc.tar.gz文件解压缩到家目录中的test01目录中[rootgiles ~]# tar -xvf abc.tar.gz -C ./test01#将abc.tar.bz2文件解压缩到家目录中的test02目录中[rootgiles ~]# tar -jxvf abc.tar.bz2 -C ./test02打包的时候参数不同对应的压缩格式也不相同但是在解压缩的时候针对不同压缩格式的解压操作这个参数可以省略掉通用解压缩参数系统将自动识别压缩格式并自动选择相应工具解压缩tar -xvf 文件名