您当前的位置:首页 > 电脑百科 > 软件技术 > 操作系统 > linux百科

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

时间:2022-04-21 11:28:50  来源:  作者:运维老男孩

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是个压缩命令,其实压缩命令是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 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文件夹:

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

 

会生成对应的归档文件:

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

文件拷贝

我们紧接上面的情景。假设我们当前的目录为项目目录,而我们手滑使用了系统自带的可视化解压工具生成了一个多余的目录。我们接下来要把系统生成的多余的归档文件夹里的文件拷贝到当前目录,那么我们可以使用带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.txt、test2.txt成功拷贝到当前项目目录了。现在我们有了个新的需求:我们在项目目录中建了一个data子目录,现在需要将项目目录中的test.txt、test2.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.txt到data目录还能正常执行:

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语句时要格外小心,因为它既有移动到目录的作用,也有重命名的作用,一不注意就可能出错!



Tags:Linux   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Linux获取Redis 性能指标方法
一、监控指标Ø 性能指标:PerformanceØ 内存指标: MemoryØ 基本活动指标:Basic activityØ 持久性指标: PersistenceØ 错误指标:Error二、监...【详细内容】
2024-04-11  Search: Linux  点击:(10)  评论:(0)  加入收藏
微软 Win11 Linux 子系统(WSL)发布 2.2.2 版本
IT之家 4 月 8 日消息,微软近日更新 Windows Subsystem for Linux(WSL),最新 2.2.2 版本中带来了诸多改进,重点更新了 nft 规则,可以让 IPv6 流量通过 Linux 容器。图源: dev.to,AI...【详细内容】
2024-04-08  Search: Linux  点击:(10)  评论:(0)  加入收藏
从原理到实践:深入探索Linux安全机制
Linux 是一种开源的类Unix操作系统内核,由Linus Torvalds在1991年首次发布,其后又衍生出许多不同的发行版(如Ubuntu、Debian、CentOS等)。前言本文将从用户和权限管理、文件系统...【详细内容】
2024-03-27  Search: Linux  点击:(24)  评论:(0)  加入收藏
在Linux系统中,如何处理内存管理和优化的问题?
本文对 Linux 内存管理和优化的一些高级技巧的详细介绍,通过高级的内存管理技巧,可以帮助系统管理员和开发人员更好地优化 Linux 系统的内存使用情况,提高系统性能和稳定性。在...【详细内容】
2024-03-26  Search: Linux  点击:(18)  评论:(0)  加入收藏
Linux 6.9-rc1 内核发布:AMD P-State 首选核心、BH 工作队列
IT之家 3 月 25 日消息,Linus Torvalds 宣布,Linux 6.9 内核的首个 RC(候选发布)版 Linux 6.9-rc1 发布。▲ Linux 6.9-rc1Linus 表示,Linux 内核 6.9 看起来是一个“相当正常”...【详细内容】
2024-03-25  Search: Linux  点击:(16)  评论:(0)  加入收藏
Linux发行版 Ubuntu 迎更新 界面设计灵感来自 Windows 11
近日,一位第三方开发者推出了一款名为“Wubuntu”的特殊Linux发行版。这款系统源自主流的Ubuntu版本,但在界面设计上却借鉴了微软最新的Windows 11风格,甚至在其中融入了微软标...【详细内容】
2024-02-27  Search: Linux  点击:(51)  评论:(0)  加入收藏
Win + Ubuntu 缝合怪:第三方开发者推出“Wubuntu”Linux 发行版
IT之家 2 月 26 日消息,一位第三方开发者推出了一款名为“Wubuntu”的缝合怪 Linux 发行版,系统本身基于 Ubuntu,但界面为微软 Windows 11 风格,甚至存在微软 Windows 徽标。据...【详细内容】
2024-02-27  Search: Linux  点击:(54)  评论:(0)  加入收藏
Linux中磁盘和文件系统工作原理解析
在Linux系统中,一切皆文件的概念意味着所有的资源,包括普通文件、目录以及设备文件等,都以文件的形式存在。这种统一的文件系统管理方式使得Linux系统具有高度的灵活性和可扩展...【详细内容】
2024-02-20  Search: Linux  点击:(60)  评论:(0)  加入收藏
Linux子系统概览
inux操作系统是一个模块化的系统,由多个子系统组成。这些子系统协同工作,使Linux能够执行各种任务。了解Linux的子系统有助于更好地理解整个操作系统的运作机制。以下是Linux...【详细内容】
2024-02-01  Search: Linux  点击:(85)  评论:(0)  加入收藏
Linux内核:系统之魂与交互之源
内核,作为任何基于Linux的操作系统的心脏,扮演着至关重要的角色。它不仅是计算机系统软件与硬件之间的桥梁,更是确保系统稳定、高效运行的关键。内核提供了一系列核心功能,为上...【详细内容】
2024-02-01  Search: Linux  点击:(73)  评论:(0)  加入收藏
▌简易百科推荐
微软 Win11 Linux 子系统(WSL)发布 2.2.2 版本
IT之家 4 月 8 日消息,微软近日更新 Windows Subsystem for Linux(WSL),最新 2.2.2 版本中带来了诸多改进,重点更新了 nft 规则,可以让 IPv6 流量通过 Linux 容器。图源: dev.to,AI...【详细内容】
2024-04-08    IT之家  Tags:Linux   点击:(10)  评论:(0)  加入收藏
从原理到实践:深入探索Linux安全机制
Linux 是一种开源的类Unix操作系统内核,由Linus Torvalds在1991年首次发布,其后又衍生出许多不同的发行版(如Ubuntu、Debian、CentOS等)。前言本文将从用户和权限管理、文件系统...【详细内容】
2024-03-27  凡夫编程  微信公众号  Tags:Linux安全   点击:(24)  评论:(0)  加入收藏
在Linux系统中,如何处理内存管理和优化的问题?
本文对 Linux 内存管理和优化的一些高级技巧的详细介绍,通过高级的内存管理技巧,可以帮助系统管理员和开发人员更好地优化 Linux 系统的内存使用情况,提高系统性能和稳定性。在...【详细内容】
2024-03-26  编程技术汇  微信公众号  Tags:Linux   点击:(18)  评论:(0)  加入收藏
Linux 6.9-rc1 内核发布:AMD P-State 首选核心、BH 工作队列
IT之家 3 月 25 日消息,Linus Torvalds 宣布,Linux 6.9 内核的首个 RC(候选发布)版 Linux 6.9-rc1 发布。▲ Linux 6.9-rc1Linus 表示,Linux 内核 6.9 看起来是一个“相当正常”...【详细内容】
2024-03-25    IT之家  Tags:Linux   点击:(16)  评论:(0)  加入收藏
轻松实现Centos系统的软件包安装管理:yum指令实战详解
yum 是一种用于在 CentOS、Red Hat Enterprise Linux (RHEL) 等基于 RPM 的 Linux 发行版上安装、更新和管理软件包的命令行工具。它可以自动解决软件包依赖关系,自动下载并...【详细内容】
2024-02-27  凡夫贬夫  微信公众号  Tags:Centos   点击:(59)  评论:(0)  加入收藏
Win + Ubuntu 缝合怪:第三方开发者推出“Wubuntu”Linux 发行版
IT之家 2 月 26 日消息,一位第三方开发者推出了一款名为“Wubuntu”的缝合怪 Linux 发行版,系统本身基于 Ubuntu,但界面为微软 Windows 11 风格,甚至存在微软 Windows 徽标。据...【详细内容】
2024-02-27    IT之家  Tags:Ubuntu   点击:(54)  评论:(0)  加入收藏
Linux中磁盘和文件系统工作原理解析
在Linux系统中,一切皆文件的概念意味着所有的资源,包括普通文件、目录以及设备文件等,都以文件的形式存在。这种统一的文件系统管理方式使得Linux系统具有高度的灵活性和可扩展...【详细内容】
2024-02-20  王建立    Tags:Linux   点击:(60)  评论:(0)  加入收藏
Linux子系统概览
inux操作系统是一个模块化的系统,由多个子系统组成。这些子系统协同工作,使Linux能够执行各种任务。了解Linux的子系统有助于更好地理解整个操作系统的运作机制。以下是Linux...【详细内容】
2024-02-01    简易百科  Tags:Linux   点击:(85)  评论:(0)  加入收藏
Linux内核:系统之魂与交互之源
内核,作为任何基于Linux的操作系统的心脏,扮演着至关重要的角色。它不仅是计算机系统软件与硬件之间的桥梁,更是确保系统稳定、高效运行的关键。内核提供了一系列核心功能,为上...【详细内容】
2024-02-01  松鼠宝贝    Tags:Linux内核   点击:(73)  评论:(0)  加入收藏
如何确保Linux进程稳定与持久
在Linux系统中,进程的稳定性与持久性对于维持系统的持续运行至关重要。然而,由于各种原因,进程可能会面临崩溃或系统重启的情况。为了确保关键进程能够持续运行,我们必须采取一...【详细内容】
2024-01-19  松鼠宝贝    Tags:Linux进程   点击:(93)  评论:(0)  加入收藏
站内最新
站内热门
站内头条