linux 基础(5)文件的打包和压缩

文件的压缩是非常重要和常见的操作。

在 Windows 下,zip 和 rar 经常使用的压缩软件,框选一堆文件,右键用 WinRAR 就可以完成压缩。不过在 linux 下通常不这么做。一是因为 linux 的压缩指令针对单个文件,将多个文件合为一个文件被称为“打包”,打包和压缩是分离的(其实 Win 下很多时候压缩文件目的主要也是打包而不是压缩嘛);二是因为 zip 和 GNU 不是一家的,所以 zip 不能完整保存压缩后文件的 rwx 等权限。

linux 常用的压缩工具有 gzip, bzip2, xz。

压缩

gzip, bzip2, xz 都是压缩单个文件的指令,通常压缩的文件以*.gz、*.bz2 或者 *.xz 作为文件名。这三个命令出现的时间越来越晚,压缩算法也越来越先进,用法基本相同,这里用 gzip 为例介绍他们。

$ gzip -选项 文件名
-c:将压缩文件通过管道输出
-v:压缩时控制台打印压缩信息
-d:解压缩参数
-1:数字表示压缩等级1-9,等级越高压缩时间越长,压缩比越好
-k:压缩后不删除源文件(默认删除)
$ gzip 1.cpp # 生成了 1.cpp.gz,源文件被删除
$ gzip -d 1.cpp.gz # 文件还原了,也可用 gunzip

要查看压缩文件的内容(如果是文本文件),无需解压缩,使用 zcat/zless/zgrep 直接查看压缩文件即可(与 cat/less/grep 对应);如果是 bzip2 文件就用 bzcat,xz 使用 xzcat。

打包

压缩指令只针对一个文件,打包 tar 可以将多个文件合成一个文件,所以压缩包常常是 .tar.gz 和 .tar.bz2 等形式。不过 tar 命令本身也承担的压缩的功能,他可以在打包完成后自动压缩。

$ tar [-zjJ]-其他命令 -f 文件名
-f:指定操作的文件名
-zjJ:z 表示使用 gzip 压缩,j 表示 bzip2,J 表示 xz。这是三选一的关系
-v:打包压缩时控制台打印信息
-p:保存数据的权限属性
-c:创建压缩包
-t:查看压缩包
-x:解压
$ tar -zcvf ./save.gz ./ # 当前目录打包到 save.gz
$ tar -ztvf ./save.gz # 查看
$ tar -zxvf ./save.gz # 解压缩

压缩的根目录问题:

同一个目录,用不同的路径写他,压缩文件里保存的路径也不一样

tar -vczf save.gz learngit
tar -vczf save.gz ../ofnoname/learngit
tar -vczf save.gz /home/ofnoname/learngit

tar -tzf save.gz # 查看压缩文件

第一个命令,压缩 learngit 文件夹,查看里面的内容,都是 learngit/xxx 的形式。而第二个命令,压缩出现提示"tar: 从成员名中删除开头的“../”",查看里面的内容,都是 ofnoname/learngit/xxx 的形式。第三个则没有了 / ,成为了home/ofnoname/learngit。

问题在于,如果你在一个地方解压缩文件,肯定是希望在当前目录下再出现一个文件夹来放置解压后的文件的,如果保留了../ofnoname/learngit,解压的时候就文件冒到上一个文件夹了;要是保留了/home/ofnoname/learngit,那更不得了,解这个压缩包文件就会直接出现在根目录了。

所以压缩的时候,默认会去除绝对目录,保证整个压缩包里是一个不能往上返回的相对目录,不过也可以使用 -P 保留原路径。

本文转载于网络 如有侵权请联系删除

相关文章

  • python 并行进程 mpi4py

    hello.pyfrommpi4pyimportMPI comm=MPI.COMM_WORLD rank=comm.Get_rank() print("helloworldfromprocess",rank)C:>mpiexec-n5pythonhelloWorld_MPI.pyjieguo('helloworldfromprocess',1) ('helloworldfromprocess',0) ('helloworldfromprocess',2) ('helloworldfromprocess',3) ('helloworldfromprocess',4)2、进程间通信 frommpi4pyimportMPI comm=MPI.COMM_WORLD rank=comm.rank print("myrankis:",rank)ifrank==0: data=10000000 destination_process=4 comm.send

  • 企业复工“利器”?买卖来了合同就该这么签!

    最近小巴因为旧手机内存不够,所以换了新手机,想着将旧的iPhone卖掉,至少还能换点钱回回血呢,第一时间就想到了某鱼平台,以往总看到卖家的诈骗套路,但这次自己是卖家应该没什么问题吧,没想到上网一搜还真不少。一连串的关键词看的小巴是一点卖货的欲望都没有了,一旦发生纠纷卖家的利益该怎么保证?日常生活中,存在大量的交易过程,个人与个人的、个人与企业的、企业与企业的,就那这些二手交易平台来说,遇到的坑实在让人防不胜防。相比个人交易来说,企业间的交易额是巨大的,一旦出现问题就会面临数以倍计的损失,所以一份合理合法的买卖合同很重要。随着5G时代的到来,“互联网+”的持续推进以及数字化程度的提升,电子合同将不仅仅是当前特殊阶段的替代之选,也将是未来合同领域的重要发展方向。据不完全的数据统计,在疫情期间,全国有将近2亿人在家办公,而这也带动了电子合同业务需求的增长,很多企业开始通过线上签署电子合同的方式来代替传统纸质合同。除了中小企业需求量井喷,不少大型企业在疫情期间,也借助电子合同企业的服务,实现高效便捷的企业内部与业务管理。电子合同能取代纸质合同吗?随着电子签名应用的兴起,电子合同开始为更多的企业

  • 数据库+算法=?

    在开始文章之前,分享一个有趣的小故事:1927年第五届索维尔会议上,爱因斯坦与波尔关于量子力学的争论达到了白热化。爱因斯坦严肃的说,“波尔,上帝不会投骰子!”。而波尔则回应说,“爱因斯坦,别去指挥上帝应该怎么做!”。爱因斯坦坚决不相信物理学最本质的规律是统计性的。我们今天聊的也是关于统计的算法,看一看抛硬币的故事一、提出问题现在我提出这样一个问题:假设一个网站每日有数以亿计的IP访问,如何高效统计ip访问的规模? 这个问题的规模很大,ip访问记录数以亿计的规模,看上去是很吓人的,但其实我们并不关心具体哪些ip访问,也不是特别在意具体的精确数字,或许这只是个模糊的需求,提问题的同学只想要知道大概的规模,但是并不关心具体的精确数字。二、解决问题这个问题可以怎么来解决?我们可以非常容易的想到以下这些方法:1.字典或者哈希将ip放到字典中,我们可以很容易的去重统计ip数。这个方法问题在于,当ip数量非常多时,非常消耗内存,我们假设一个IP占用4B,那么10亿个IP需要的内存为40GB,这个容量太大了!如果一个应用中的一个统计功能需要40GB,显然我们是不能接受的。同时插入的复杂度也不低,并且两

  • 时域音频分离模型登GitHub热榜,效果超传统频域方法,Facebook官方出品

    晓查发自凹非寺 量子位报道用AI对歌曲音轨的分离研究很多,不过大多数都是在频域上进行的。这类方法先把声音进行傅立叶变换,再从频谱空间中把人声、乐曲声分别抽离出来。比如,上个月在GitHub上大热的Spleeter,就是这样。但是由于要计算频谱,这类工具存在着延迟较长的缺点。虽然之前也有一些对声音波形进行处理的方法,但实际效果与频域处理方法相差甚远。最近,FacebookAI研究院提供了两种波形域方法的PyTorch实现,分别是Demucs和Conv-Tasnet,而且测试结果均优于其他常见的频域方法,目前登上了GitHub日榜效果对比话不多说,我们先来听听这段30s音频的分离实测效果。这两种方法在MusDB上的训练结果已经接近了频域方法的最优结果,加入150首额外的训练数据后,总体信号失真比(overallSDR)达到了6.3,超过了其他所有方法。 安装与使用方法先将代码下载到本地,根据自己用CPU还是GPU来选择不同的安装环境:condaenvupdate-fenvironment-cpu.yml#ifyoudon’thaveGPUs condaenvupdate-fenvironm

  • Java 并发编程(三):如何保证共享变量的可见性?

    上一篇,我们谈了谈如何通过同步来保证共享变量的原子性(一个操作或者多个操作要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行),本篇我们来谈一谈如何保证共享变量的可见性(多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值)。 我们使用同步的目的不仅是,不希望某个线程在使用对象状态时,另外一个线程在修改状态,这样容易造成混乱;我们还希望某个线程修改了对象状态后,其他线程能够看到修改后的状态——这就涉及到了一个新的名词:内存(可省略)可见性。要了解可见性,我们得先来了解一下Java内存模型。Java内存模型(JavaMemoryModel,简称JMM)描述了Java程序中各种变量(线程之间的共享变量)的访问规则,以及在JVM中将变量存储到内存→从内存中读取变量的底层细节。要知道,所有的变量都是存储在主内存中的,每个线程会有自己独立的工作内存,里面保存了该线程使用到的变量副本(主内存中变量的一个拷贝)。见下图。也就是说,线程1对共享变量chenmo的修改要想被线程2及时看到,必须要经过2个步骤:1、把工作内存1中更新过的共享变量刷新到主内存中。2、

  • oracle创建表空间

    /*分为四步*/ /*第1步:创建临时表空间*/ createtemporarytablespaceuser_temp tempfile'D:\oracle\oradata\Oracle9i\user_temp.dbf' size50m autoextendon next50mmaxsize20480m extentmanagementlocal; /*第2步:创建数据表空间*/ createtablespaceuser_data logging datafile'D:\oracle\oradata\Oracle9i\user_data.dbf' size50m autoextendon next50mmaxsize20480m extentmanagementlocal; /*第3步:创建用户并指定表空间*/ createuserusernameidentifiedbypassword defaulttablespaceuser_data temporarytablespaceuser_temp; /*第4步:给用户授予权限*/ gran

  • 封装内容和功能 – YUI TabView使用小记

    本文主要内容取自CaridyPatino在2008年发布的文章,原文中使用的是YUI2,笔者对例子做了一些更新,均使用了YUI3.1.1,文章中讨论的这个问题,在Ajax满天飞的现在具有典型意义,所以拿出来重新重新炒了一下。通常的应用场景中,为了节省和有效利用页面空间,会使用Tab。如果我们有一个Tab,每个Tab展示后提供不同的功能,功能较少时,我会选择将处理用户事件的JS代码写在页面中。例如,在使用YUI的情况下:构建页面DOM:构建符合要求的页面DOM(当然我们也可以使用YUI来动态的创建DOM,但这样就丧失了搜索引擎友好的特性)。<divid="demo">    <ul>        <li><ahref="#foo">foo</a></li>        <li><ahref="#bar">bar</a></li>        <li><ahref="#baz&q

  • Tomcat 10:用 JSTL 报错 TagLibraryValidator

    今天想要在JSP页面上用JSTL简化操作,发现导入jstl、standard包报错了。我是按照菜鸟上的教程来的。我的Tomcat版本是10.0,之后发现10.0版本的Tomcat导入的是以下几个包: <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.3.3</version> <scope>provided&l

  • Springmvc的拦截器执行顺序及各方法作用

    实现HandlerInterceptor接口或者继承HandlerInterceptor的子类,比如Spring已经提供的实现了HandlerInterceptor接口的抽象类HandlerInterceptorAdapter,下面讲实现其接口的写法,先看一下这个接口的三个方法.  - 方法preHandle:顾名思义,该方法将在请求处理之前进行调用,在controller之前执行。SpringMVC中的Interceptor是链式的调用的,在一个应用中或者说是在一个请求中可以同时存在多个Interceptor。每个Interceptor的调用会依据它的声明顺序依次执行,而且最先执行的都是Interceptor中的preHandle方法,所以可以在这个方法中进行一些前置初始化操作或者是对当前请求的一个预处理,比如说获取cookie的值或者判断是否已经登录,也可以在这个方法中进行一些判断来决定请求是否要继续进行下去。该方法的返回值是布尔值Boolean类型的,当它返回为false时,表示请求结束,后续的Interceptor和Controller都不会再执行;当返回值

  • JS组件系列——又一款MVVM组件:Vue(二:构建自己的Vue组件)

    前言:转眼距离上篇 JS组件系列——又一款MVVM组件:Vue(一:30分钟搞定前端增删改查) 已有好几个月了,今天打算将它捡起来,发现好久不用,Vue相关技术点都生疏不少。经过这几个月的时间,Vue的发展也是异常迅猛,不过这好像和博主都没什么太大的关系,博主还是老老实实研究自己的技术吧。技术之路还很长,且行且研究吧。 本文原创地址:http://www.cnblogs.com/landeanfen/p/6518679.html 一、为什么组件很重要 前两天,看到一篇关于 汇总vue开源项目 的文章,资源非常丰富,不得不感叹开源社区的强大。随便点进去看了几个UI组件,基本都不是原生的html用法,如果你不懂Vue的组件相关概念,看到一些“稀奇古怪”的标签写法,可能会使用,但肯定无法理解为什么可以这么写。比如我们随便找了一个名叫IView的来看看: <i-inputtype="text":value.sync="formInline.user"placeholder="Username"> <Icontype="ios-pers

  • Cannot format given Object as a Date

    这个小错挺有意思的,记录一下 导出Excel的时候,同事直接用format…… 前提:数据库中该字段是 Timestamp---- 2016-06-2022:49:02.967 写个测试说明一下: Stringtemp="2016-06-2022:49:02.967"; //temp=temp.substring(0,aaa.lastIndexOf(".")); Datedate=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss").parse(temp); Stringstr=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss").format(date); System.out.println("====thistime==="+str); 复制   这个 format和parse需要传入的参数类型是有要求的,不能乱传。 其实也可以直接在sql中直接处理。to_date(ttvl.use_date,'yyyy-mm-ddhh24:mi:ss')--看需要格式 乱传…… 那就报错呗……

  • vue简介,插值语法,vue指令系统

    前端页面发展 Vue的快速使用 插值语法 指令系统之文本指令 指令系统之事件指令 指令系统之属性指令 前端页面发展 1.HTML(5)、CSS(3)、JavaScript(ES5、ES6):编写一个个的页面->给后端(PHP、Python、Go、Java)->后端嵌入模板语法->后端渲染完数据->返回数据给前端->在浏览器中查看    #ECMA标准   # JavaScript=ECMA+bom+dom 2.Ajax的出现->后台发送异步请求,Render+Ajax混合 3.单用Ajax(加载数据,DOM渲染页面):前后端分离的雏形 4.Angular框架的出现(1个JS框架):出现了“前端工程化”的概念(前端也是1个工程、1个项目) 5.React、Vue框架:当下最火的2个前端框架(Vue:国人喜欢用,React:外国人喜欢用) 6.移动开发(Android+IOS)+Web(Web+微信小程序+支付宝小程序)+桌面开发(Windows桌面):前端-> 大前端 7

  • codeforce刷题(六)

    G.MaximizetheRemainingString 由小写字母组成的字符串\(s\),每次从中选取重复的字母进行删除,直到该字符串中的每个字母都只出现一次。问:最终形成的字典序最大的字符串,比如\(ababab\),答案为\(ba\)。 \(1\leqlen(s)\leq200000\) 题解 记\(s=a_1a_2a_3\cdotsa_n\),最后的字符串为\(s'\),它的首字符在\(s\)中对应位置为\(p\),显然\(p\)之前的字符都被删除了,并且被删除的字符在\(p\)位置之后都出现过,根据这个性质,二分枚举\(p\)。假设子串\(a_1a_2\cdotsa_p\)中字典序最大的字符为\(a_i\): \(a_i>a_p\),则字符\(a_i\)作为\(s'\)的首字符,更新\(s=a_{i+1}a_{i+2}a_{i+3}\cdotsa_n\)-\(\{a_i\}\),(减号表示删除前一个字符串中所有的后一个字符) \(a_i==a_p\),则字符\(a_i\)作为\(s'\)的首字符,更新\(s=a_{p+1}a_{p+2}a_{p+3}\cdotsa_n

  • darknet yolov3训练

    训练环境:win10cuda10.1cudnn10.1darknet https://github.com/pjreddie/darknetconda3标注数据1、工具labelimggithub的安装包地址:https://github.com/tzutalin/labelImgcondainstallpyqt=5 pyrcc5-olibs/resources.pyresources.qrc pythonlabelImg.py复制将自己图片标注出来开始训练模型我编译后的目录在这个位置C:\darknet\build\darknet\x64进入这里构建目录结构目录结构base)PSC:\darknet\build\darknet\x64\VOCdevkit>tree 文件夹PATH列表 卷序列号为EE6F-0ADF C:. └─VOC2007    ├─Annotations 放所有的训练和测试图片    ├─ImageSets    │&n

  • sql注入攻击

     

  • 作业 4:词频统计——基本功能

    一、基本信息       本次作业的地址:https://edu.cnblogs.com/campus/ntu/Embedded_Application/homework/2088   项目Git地址:https://gitee.com/ntucs/PairProg.git   结对成员:王立凯1613072048        张天弈1613072049 二、项目分析   Task1基本任务     实现一个控制台程序,在给定一个英文字符串文件,统计其中各个英文单词出现的频率。   1.程序运行模块(方法、函数)介绍:   (1)统计文件中的有效行数,存放在lines中 1file=open(dst,'r')#dst为文本的目录路径 2lines=len(file.readlines())复制   (2)统计文件中的单词总数 1defprocess_buffer(bvffer):#处理缓冲区,返回存放每个单词频率的字典WordCount,单词总数 2ifbvffer: 3WordCount={} 4#将文本内容都小写

  • 剑指 Offer 36. 二叉搜索树与双向链表

    剑指Offer36.二叉搜索树与双向链表 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。 思路 排序列表:二叉搜索树的中序遍历是有序的 双向链表:设置前驱节点pre和当前节点cur,pre.right=cur,cur.left=pre 循环链表:head.left=tail,tail.right=head 代码 pre=node是在访问完左孩子的时候设置的,因为这是中序遍历,我老是想成重建二叉树,这个左右孩子的关系不是原来的二叉树的关系!!!! classSolution{ Nodepre,head; publicNodetreeToDoublyList(Noderoot){ if(root==null)returnnull; dfs(root); head.left=pre; pre.right=head; returnhead; } voiddfs(Nodenode){ if(node==null)return; dfs(node.left); if(pre!=null)pre.right=node;

  • 377. 组合总和 Ⅳ

    ✅求装满背包的物品的排列总和 这里是求排列,而不是组合!!!即是[1,2],[2,1]是两个东西 ?在背包问题里求排列的方法是: 排列:先遍历背包容量,再遍历物品 组合:先遍历物品,再遍历背包容量 这里再注意到这里是完全背包,再遍历背包容量的时候正序就好了 classSolution{ public: intcombinationSum4(vector<int>&nums,inttarget){ vector<int>dp(target+1,0); dp[0]=1; for(intj=0;j<=target;j++){ for(inti=0;i<nums.size();i++){ if(j>=nums[i]&&dp[j]<INT_MAX-dp[j-nums[i]]) dp[j]+=dp[j-nums[i]]; } } returndp[target]; } }; 复制

  • 热消融影像引导

    1.Planning,whichamongotherthings,requiresaccu-rateidentificationofthelocationandspatialextentofthepathologytobetreated, 2.guidance,whichinadditionto1.,requiresaccuratepredictionofthelocationandspatialextentofthethermallesionbeforeitsformation, 3.treatmentmonitoring,whichrequirestheabilitytoimagewithhighcontrastthelocationandextentofregionsofablatedtissue, 4.monitoringofresponse,whichamongotherthings,requirestheabilitytoobservechangesintissuear-chitectureandbloodflowduetotissuehealing.

  • Autoware 笔记No.9,SSD车辆、行人(障碍物)识别(ssd vision detect)

    一.前言 本小结着重介绍一下vision_ssd_detect部分。   二.安装 (1)下载ssdcaffe,一定要安装在home目录下,否则vision_ssd_detect.launch文件中的network_definition_file和pretrained_model_file路径会有变化。 %gitclone-bssdhttps://github.com/weiliu89/caffe.gitssdcaffe %cdssdcaffe %gitcheckout4817bf8b4200b35ada8ed0dc378dceaf38c539e4复制 (2)修改Makefile.config,我用的CUDA10.0,直接贴出我的Makefile.config (3)编译 make&&makedistribute复制 (4)下载预先训练好的模型,网址:https://github.com/weiliu89/caffe/tree/ssd,在readme,models中选一个SSD512的模型,解压,并拷贝到~/ssdcaffe/models/目录。 $

  • django项目怎么利用gunicorn进行部署

    django项目怎么利用gunicorn进行部署   1、开发环境运行项目 python mange.py runserver 0.0.0.0:8000复制 2、使用gunicorn在生产环境部署 Gunicorn“绿色独角兽”是一个被广泛使用的高性能的PythonWSGIUNIXHTTP服务器 pip install gunicorn gunicorn -w 2 -b 0.0.0.0:8000 project_django.wsgi复制 常用参数: -c指定一个配置文件(py文件)-b与指定的socket进行绑定-D以守护进程形式来运行Gunicorn进程,其实就是将这个服务放到后台去运行-w工作的进程数量;-k工作进程类型,sync(默认),eventlet,gevent,ortornado,gthread,gaiohttp.http://docs.gunicorn.org/en/latest/settings.html 3、其它:使用gunicorn部署django项

相关推荐

推荐阅读