Linux shell进行文件解压,复制和移动详解

目录
  • 将文件单个地进行压缩与解压
  • tar:打包命令
  • 文件拷贝
  • 文件移动

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.zip
  inflating: test.txt

如果我们想要将test.txt重新压缩呢?你可能情不自禁会执行zip test.txt,然后我们发现提示:

orion-orion@MacBook-Pro Learn-Linux % zip test.txt
        zip warning: missing end signature--probably not a zip file (did you
        zip 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.txt
  adding: test.txt (stored 0%)

当然,zip也支持将多个文件压缩:

orion-orion@MacBook-Pro Learn-Linux % zip test3.zip test.txt test2.txt
  adding: test.txt (stored 0%)
  adding: test2.txt (stored 0%)

此时我们发现再解压test3.zip会发现重新得到了两个原始文件:

orion-orion@MacBook-Pro Learn-Linux % unzip test3.zip
Archive:  test3.zip
 extracting: test.txt
 extracting: test2.txt

zip也支持对目录压缩,如我们尝试压缩test目录:

orion-orion@MacBook-Pro Learn-Linux % zip test4.zip test
  adding: test/ (stored 0%)

此时再解压test4.zip则会重新生成test目录:

orion-orion@MacBook-Pro Learn-Linux % unzip test4.zip
Archive:  test4.zip
   creating: test/

不过,zip是将输入的文件列表分别进行压缩的操作,即是对目录来进行压缩也是对目录内的所有文件one-by-one的操作。那我们需要将很多文件先打包成一个文件,然后再压缩呢?此时就要用到tar了。

tar:打包命令

很多人误解tar是个压缩命令,其实压缩命令是gzipxz以及我们上文提到的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 test
a test
a 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.txt
a test.txt
a test2.txt

然后将其解压到当前目录:

orion-orion@MacBook-Pro Learn-Linux % tar -xv -f test3.zip -C .
x test.txt
x test2.txt

由上面所说,zip/unzip和tar都是压缩什么解压出来就是什么,原来是目录就是目录,原来没目录不会帮你自动生成一个目录,但Linux或Mac系统的可视化压缩工具就不一样了(在Mac中被称为「归档实用工具」)。Mac中对目录压缩时压缩命令和tar命令是等效的,比如我们想用Mac自带的压缩工具压缩test文件夹:

会生成对应的归档文件

再解压会得到同样的文件夹(会自动帮我们重命名),不会帮我们生成多余的目录

然而,如果我们尝试用Mac自带的压缩工具压缩多个文件

它会自动帮我们生成一个名为归档.zip的文件

然后,如果此时我们尝试对归档.zip文件进行解压,会发现系统会自动帮我们生成一个名为归档 的文件夹:

这个文件夹内部才是我们需要的文件

这在对大量文件操作时需要额外注意,否则会白白开销你一次拷贝文件的时间!

文件拷贝

我们紧接上面的情景。假设我们当前的目录为项目目录,而我们手滑使用了系统自带的可视化解压工具生成了一个多余的目录。我们接下来要把系统生成的多余的归档文件夹里的文件拷贝到当前目录,那么我们可以使用带r参数的cp命令:

orion-orion@MacBook-Pro Learn-Linux % cp -r 归档/ .
orion-orion@MacBook-Pro Learn-Linux % ls
test.txt        test2.txt       归档

这里-r参数表示递归复制命令,用于目录的递归复制。注意命令中的归档/表示归档目录下的所有文件,意思和归档/*相同:

orion-orion@MacBook-Pro Learn-Linux % cp -r 归档/* .
orion-orion@MacBook-Pro Learn-Linux % ls
test.txt        test2.txt       归档

选项参数-r写成-R是等效的:

orion-orion@MacBook-Pro Learn-Linux % cp -R 归档/* .
orion-orion@MacBook-Pro Learn-Linux % ls
test.txt        test2.txt       归档

但如果直接传入参数归档,则表示将这个目录整个地复制:

orion-orion@MacBook-Pro Learn-Linux % cp -r 归档 .
cp: ./归档 and 归档 are identical (not copied).

同一个目录下不可能有两个相同名称的子目录,这当然就会出错,当然我们可以将其复制到另外一个目录里:

orion-orion@MacBook-Pro Learn-Linux % cp -r 归档 /tmp
orion-orion@MacBook-Pro Learn-Linux % ls /tmp |grep 归档
归档

你可能要问,加r和不加r有啥区别?如果不加r,则默认是跳过目录的,也就是说只能copy文件:

orion-orion@MacBook-Pro Learn-Linux % cp  归档/ .
cp: 归档/ is a directory (not copied).
orion-orion@MacBook-Pro Learn-Linux % cp  归档 /tmp
cp: 归档 is a directory (not copied).

文件移动

我们还是紧接着上面的场景。假定我们已经将归档文件夹中的test.txttest2.txt成功拷贝到当前项目目录了。现在我们有了个新的需求:我们在项目目录中建了一个data子目录,现在需要将项目目录中的test.txttest2.txt移动到data子目录中。这就需要如下命令:

orion-orion@MacBook-Pro Learn-Linux % mv test2.txt test.txt data
orion-orion@MacBook-Pro Learn-Linux % ls data
test.txt        test2.txt

注意,如果有多个源文件或目录,则最后一个目标文件(也就是这里的data)一定是目录。当我们只移动一个文件时,就有潜在的二义性。这里因为data目录本身存在,我们移动test.txtdata目录还能正常执行:

orion-orion@MacBook-Pro Learn-Linux % mv test.txt data
orion-orion@MacBook-Pro Learn-Linux % ls data
test.txt

但是如果data目录不存在,就会将mv解释为重命名的意思,比如如果我们将data目录删除再执行:

orion-orion@MacBook-Pro Learn-Linux % mv test.txt data

此时就等效于把test.txt更名为data文件:

orion-orion@MacBook-Pro Learn-Linux % ls -l|grep data
-rw-r--r--  1 orion-orion  staff    0  4 20 22:01 data

可以看出,第一个字母是-,也就意味着data是普通文件,不是目录(是目录的话第一个字母是d)。

因此,使用mv语句时要格外小心,因为它既有移动到目录的作用,也有重命名的作用,一不注意就可能出错!

到此这篇关于Linux shell进行文件解压,复制和移动详解的文章就介绍到这了,更多相关Linux shell文件内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Linux shell实现压缩多个文件代码实例

    Linux环境下写一个脚本 从键盘让用户输入几个文件,脚本能够将此几个文件归档压缩成一个文件: 1.首先介绍一下case语句格式 2.脚本如下: DEST读取的是压缩后文件的名称,COMP读取的是压缩的方式 给文件加权限: 创建三个文件: 执行脚本: 查看到压缩文件已经生成: 至此,脚本实现了压缩三个文件. 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们.

  • Linux shell 提取文件名和目录名的方法

    ${} [root@node01 ~]# file=/dir1/dir2/dir3/my.file.txt [root@node01 ~]# echo ${file#*/} dir1/dir2/dir3/my.file.txt 删掉第一个 / 及其左边的字符串 [root@node01 ~]# echo ${file##*/} my.file.txt 删掉最后一个 /  及其左边的字符串 [root@node01 ~]# echo ${file#*.} file.txt 删掉第一个 .  及其左

  • Linux下文件剪切的shell脚本实现代码

    需求描述 编写shell脚本实现Linux下不同目录(路径)之间的文件的剪切(移动)操作. 其中,文件移动之前所在的目录称为源目录,文件移动之后所在的目录称为目的目录.要求当源目录不存在.源目录下无文件及剪切文件成功时,均要在屏幕上输出相关的日志信息:并且,在程序执行之前,只有源目录是存在的,目的目录需要由程序创建. shell脚本 umask 0000 if [ -d $1 ] then fcnt=`ls -l $1 | wc -l` if [ $fcnt -ne 1 ] then mkdir

  • linux Shell获取某目录下所有文件夹的名称

    查看目录下面的所有文件: #!/bin/bash cd /目标目录 for file in $(ls *) do echo $file done 延伸的方法,查看目录下面的所有目录 #!/bin/bash cd /export/bak/original_document for dir in $(ls split*) do [ -d $dir ] && echo $dir #先判断是否是目录,然后再输出 done

  • Linux Shell获取文件夹下的文件名方法

    有时候需要获取某个文件夹下的所有文件名,可以用程序实现,但是打开IDE,编译运行太麻烦,在Linux服务器中通常不能打开IDE,此时可以用几行简单的shell命令来实现,结果保存到某个文件中即可. Shell脚本如下: #!/bin/bash # get all filename in specified path path=$1 files=$(ls $path) for filename in $files do echo $filename >> filename.txt done 以上

  • Linux shell进行文件解压,复制和移动详解

    目录 将文件单个地进行压缩与解压 tar:打包命令 文件拷贝 文件移动 Linux下进行文件的解压.复制.移动应该是最常见的操作了.尤其是我们在项目中使用大量的数据集文件(比如机器学习)时.然而使用这些命令时一不留神就会掉进坑里,这篇文章我们就来细数用Shell进行文件操作的这些坑. 将文件单个地进行压缩与解压 Linux下压缩文件的常见扩展名包括.gz,.tar,.tar.gz, .zip等.这些压缩格式都能够跨平台(Windows/Mac/Linux)使用.下面我们以.zip文件为例子来讲解

  • Linux查看日志文件写入速度的4种方法详解

    目录 简介 使用dd 使用pv 使用cv命令 编写小脚本 举一反三 简介 有时,我们需要查看某个文件的增长速度,如日志文件,以此来感受系统的负载情况,因为一般情况下,日志写入越快,说明系统负载越重. 本文就来介绍下Linux中查看日志增长速度的几种方法,如下: 使用dd 首先要介绍的是dd,因为dd命令几乎所有主流发行版都自带,无需额外安装,如下: $ tail -F app.log | dd of=/dev/null status=progress 3875840 bytes (3.9 MB)

  • Linux Shell脚本多命令执行逻辑的示例详解

    目录 简介 一.分号 二.&& 三.|| 案例剖析 简介 Linux 中可以使用分号";“.双and号”&&“和双竖线”||"来连接多个命令.根据场景的不同适当的使用合适的符号. 历史攻略 python:执行dos命令.Linux命令 命令连接符解析: 仅连接,表示运行先后,无逻辑关系:分号";",如command1 ; command2 逻辑与关系:&&,如command1 && command2 逻

  • MySql 5.7.14 解压版安装步骤详解

    下面主要分为五大步给大家介绍mySql 5.7.14 解压版安装教程.感兴趣的朋友一起看看吧. 第一步:下载最近的MySQL文件并且解压: 下载最新版的MySQL–mysql-5.7.12下载地址 将下载到的文件解压缩到自己喜欢的位置,例如我自己的位置是D:\MySQL\mysql-5.7.12-winx64 第二步:配置环境变量 这里不多说,bin目录配置到path下面就行了. 第三步:添加配置文件 直接复制一个解压路径下面的 my-default.ini文件,重命名为my.ini然后编辑该文

  • shell去掉文件中空行(空白行)的方法详解

    本文详细介绍了使用shell去除文件中的空行的方法,学习下sed.awk.shell文件检测的方法,有需要的朋友可以作个参考. 本节内容:shell去掉文件中空行 1,shell 去掉文件中的空行 复制代码 代码如下: cat filename | sed -e '/^$/d' > filename 2,保留最新的9个文件,其它的文件删除的命令语句 复制代码 代码如下: ls -t | awk '{if(NR>9){print $0}}' |xargs rm -f 附,shell中的特殊变量

  • mysql5.7.19 解压版安装教程详解(附送纯净破解中文版SQLYog)

    Mysql5.7.19版本是今年新推出的版本,最近几个版本的MySQL都不再是安装版,都是解压版了,这就给同志们带来了很多麻烦,挖了很多坑,单单从用户使用的易用性来讲,这么做着实有点反人类啊! 笔者也是反反复复的折腾了快一个小时才成功搞定,过程中也网搜了很多的教程,可惜很多也都是,索性自己记录一下,免得下次再重复入坑. 另: MySQL的图形化工具有很多种,笔者自我感觉SQLYog比较好用,纯属个人感觉,不喜勿喷!附送破解版SQLYog. 笔者使用环境: win10 x64 1. 下载安装包 访

  • linux shell 字符串操作(长度,查找,替换)详解

    在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作. 其实shell内置一系列操作符号,可以达到类似效果,大家知道,使用内部操作符会省略启动外部程序等时间,因此速度会非常的快. 一.判断读取字符串值 表达式 含义 ${var} 变量var的值, 与$var相同     ${var-DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值 * ${var:-DEFAULT} 如果var没有被声明, 或者其值为空, 那

  • linux把一个文件的内容复制到另一个文件的末尾

    问题描述: 比如11的文件内容是: hello 22的文件内容是: world 将22的文件内容复制到11文件的末尾,11文件的效果就是: hello world 解决办法: cat 22 >> 11 >>的意思是追加的意思 > 的意思是重定向的意思,会覆盖原先的内容 小Tips: 将a.txt文件的内容清除,并且使得文件的大小为0,而不删除文件可以: cat /dev/null > a.txt 知识点扩展: linux 把文件末尾输出到另一个文件 ">

  • Linux server配置安装Java与Tomcat服务器教程详解

    系统:Ubuntu 16.04 dev_desktop 1.Java安装并配置环境变量 (1)从Java官方网站下载最新版JDK: http://www.oracle.com/technetwork/java/javase/downloads/index.html 下载jdk压缩包 jdk-8u144-linux-x64.tar.gz (2)  将压缩包解压并复制到/usr/lib 目录下 tar -zxvf jdk-8u144-linux-x64.tar.gz sudo cp -r ./jdk

随机推荐