Linux:文件解压、复制和移动的若干坑

linux下进行文件的解压、复制、移动应该是最常见的操作了 。尤其是我们在项目中使用大量的数据集文件(比如机器学习)时 。然而使用这些命令时一不留神就会掉进坑里,这篇文章我们就来细数用Shell进行文件操作的这些坑 。
将文件单个地进行压缩与解压Linux下压缩文件的常见扩展名包括.gz,.tar,.tar.gz, .zip等 。这些压缩格式都能够跨平台(windows/mac/Linux)使用 。下面我们以.zip文件为例子来讲解 。我们已知一个文本文件压缩包test.zip,想把它解压,很简单,运行unzip命令即可:
orion-orion@MacBook-Pro Learn-Linux % unzip test.zip Archive:test.zipinflating: test.txt如果我们想要将test.txt重新压缩呢?你可能情不自禁会执行zip test.txt,然后我们发现提示:
orion-orion@MacBook-Pro Learn-Linux % zip test.txtzip warning: missing end signature--probably not a zip file (did youzip warning: remember to use binary mode when you transferred it?)zip warning: (if you are trying to read a damaged archive try -F)zip error: Zip file structure invalid (test.txt)其实是传参数传错了,导致zip误把test.txt当成压缩后的文件名了,这当然不是合法的 。我们看zip的参数构成:
zip [-options] [-b path] [-t mmddyyyy] [-n suffixes] [zipfile list] [-xi list][-b path]是压缩后的.zip文件的路径,zipfile list是待压缩的文件列表 。于是,我们这样写即可成功压缩:
orion-orion@MacBook-Pro Learn-Linux % zip test2.zip test.txtadding: test.txt (stored 0%)当然,zip也支持将多个文件压缩:
orion-orion@MacBook-Pro Learn-Linux % zip test3.zip test.txt test2.txtadding: test.txt (stored 0%)adding: test2.txt (stored 0%)此时我们发现再解压test3.zip会发现重新得到了两个原始文件:
orion-orion@MacBook-Pro Learn-Linux % unzip test3.zipArchive:test3.zip extracting: test.txtextracting: test2.txtzip也支持对目录压缩,如我们尝试压缩test目录:
orion-orion@MacBook-Pro Learn-Linux % zip test4.zip testadding: test/ (stored 0%)此时再解压test4.zip则会重新生成test目录:
orion-orion@MacBook-Pro Learn-Linux % unzip test4.zip Archive:test4.zipcreating: test/不过,zip是将输入的文件列表分别进行压缩的操作,即是对目录来进行压缩也是对目录内的所有文件one-by-one的操作 。那我们需要将很多文件先打包成一个文件,然后再压缩呢?此时就要用到tar了 。
tar:打包命令很多人误解tar是个压缩命令,其实压缩命令是gzip、xz以及我们上文提到的zip这些 。tar是个打包命令,只不过附带压缩与解压的功能 。tar的选项多如牛毛,为了减轻大家的记忆负担,我们只介绍下面两个选项:
-c: 建立打包文件(可搭配-v将过程中打包的文件可视化);
-x:解包或解压缩的功能(可搭配-C在特定目录解压);
(其实还有表示通过gzip进行压缩/解压缩的-z,通过bzip2的支持进行压缩/解压缩的-j,通过xz的支持进行压缩解压缩的-J等,但我们这里统一用.zip示范,就省去这些参数了)
那么,我们只需要记住下面的命令即可:
压缩: tar -cv -f filename.zip 要被压缩的文件或目录名称
解压缩:tar -xv -f filename.zip -C 欲解压的目录(这个目录必须已经存在)
注意,压缩传参顺序是压缩后的.zip文件在前,压缩前的文件在后,别搞错了 。(让人联想到gcc编译器,不过gcc传参时规定是-o output_file.out的形式来指定输出的可执行文件,就回避了这个顺序问题)
比如,我们要将test文件夹(该文件夹下有一个test.txt文件)压缩,可以运行如下命令:
orion-orion@MacBook-Pro Learn-Linux % tar -cv -f test4.zip testa testa test/test.txt然后将其解压到当前目录,可运行如下命令:
orion-orion@MacBook-Pro Learn-Linux % tar -xv -f test4.zip -C .x test/x test/test.txt对多个文件压缩:
orion-orion@MacBook-Pro Learn-Linux % tar -cv -f test3.zip test.txt test2.txta test.txta test2.txt然后将其解压到当前目录:
orion-orion@MacBook-Pro Learn-Linux % tar -xv -f test3.zip -C .x test.txtx test2.txt由上面所说,zip/unzip和tar都是压缩什么解压出来就是什么,原来是目录就是目录,原来没目录不会帮你自动生成一个目录,但Linux或Mac系统的可视化压缩工具就不一样了(在Mac中被称为「归档实用工具」) 。Mac中对目录压缩时压缩命令和tar命令是等效的,比如我们想用Mac自带的压缩工具压缩test文件夹:

Linux:文件解压、复制和移动的若干坑

文章插图


推荐阅读