tar 命令中的绝对路径和相对路径使用注意

tar 命令中的绝对路径和相对路径使用注意

Mar 14, 2023
Linux, Shell

tar 命令是在 Linux 操作系统中用于打包和压缩文件的命令,先看下基本使用,然后再讨论相对路径和绝对路径的问题。

基本使用方法 #

压缩 #

要将多个文件打包成一个文件,可以使用以下命令:

tar -cvf {输出文件名} {要打包的文件1} {要打包的文件2} ...

其中,

  • c 选项表示创建一个新的压缩文件;
  • v 选项表示显示详细的打包信息;
  • f 选项表示指定要输出的文件名。

例如,要将文件 file1.txtfile2.txt 打包成一个名为 files.tar 的文件,可以使用以下命令:

tar -cvf files.tar file1.txt file2.txt

这将会在当前目录下创建一个名为 files.tar 的打包文件,其中包含 file1.txtfile2.txt 两个文件。

显示文件列表 #

要显示一个压缩包下的文件列表,可以使用以下命令:

tar -tzvf {压缩包文件名}

其中,

  • t 选项表示显示压缩包中的文件列表;
  • z 选项表示以 gzip 压缩格式解压;
  • v 选项表示显示详细的解压信息;
  • f 选项表示指定要解压的文件名。

例如,要显示名为 list.tar.gz 的压缩包中的文件列表,可以使用以下命令:

tar -tzvf list.tar.gz

这将会在终端中显示出 list.tar.gz 压缩包中的所有文件列表。

解压 #

普通解压 #

要将一个压缩文件解压缩到当前目录下,可以使用以下命令:

tar -xvf {压缩文件名}

其中,

  • x 选项表示解压文件;
  • v 选项表示显示详细的解压信息;
  • f 选项表示指定要解压的文件名。

例如,要解压名为 files.tar 的压缩文件,可以使用以下命令:

tar -xvf files.tar

这将会将 files.tar 文件解压缩到当前目录下。

解压特定文件 #

要解压一个压缩列表中的特定文件,可以使用以下命令:

tar -xzvf {压缩列表文件名} {要解压的文件名}

其中,

  • x 选项表示解压文件;
  • z 选项表示以 gzip 压缩格式解压;
  • v 选项表示显示详细的解压信息;
  • f 选项表示指定要解压的文件名。

例如,要解压名为 list.tar.gz 的压缩列表中的文件 file.txt,可以使用以下命令:

tar -xzvf list.tar.gz file.txt

这将会将 file.txt 文件解压到当前目录下。

解压到指定路径 #

要将一个压缩文件解压缩到指定的目录中,可以使用以下命令:

tar -xvf {压缩文件名} -C {目标目录}

例如,要将名为 files.tar 的压缩文件解压缩到目录 /home/user 中,可以使用以下命令:

tar -xvf files.tar -C /home/user

这将会将 files.tar 文件解压缩到目录 /home/user 中。

注意:-C 并不会新建文件夹,你需要保证提供的文件夹已存在。

解压特定文件到指定路径 #

要将一个压缩文件解压缩到指定的目录中,并解压缩其中的特定文件,可以使用以下命令:

tar -xvf {压缩文件名} -C {目标目录} {要解压的文件名}

例如,要将名为 files.tar 的压缩文件解压缩到目录 /home/user 中,并解压缩其中的文件 file1.txt,可以使用以下命令:

tar -xvf files.tar -C /home/user file1.txt

这将会将 files.tar 文件解压缩到目录 /home/user 中,并解压缩其中的 file1.txt 文件。

绝对路径 #

了解了基本使用方法,下面开始正文。。。

假设我有两个文件和一个空文件夹:

pwd
/Users/yindongliang/test/tarfile
➜ ll
-rw-r--r--  1 yindongliang  staff     6B Mar 13 18:06 hello.txt
-rw-r--r--  1 yindongliang  staff     6B Mar 13 18:07 world.txt
drwxr-xr-x  3 yindongliang  staff    96B Mar 13 22:53 xdir

此时我需要将两个文件带着绝对路径进行压缩:

➜ tar -zcvf abs.tar.gz /Users/yindongliang/test/tarfile/hello.txt /Users/yindongliang/test/tarfile/world.txt
tar: Removing leading '/' from member names
a Users/yindongliang/test/tarfile/hello.txt
a Users/yindongliang/test/tarfile/world.txt
➜ ll
total 16
-rw-r--r--  1 yindongliang  staff     0B Mar 13 22:57 abs.tar.gz
-rw-r--r--  1 yindongliang  staff     6B Mar 13 18:06 hello.txt
-rw-r--r--  1 yindongliang  staff     6B Mar 13 18:07 world.txt
drwxr-xr-x  3 yindongliang  staff    96B Mar 13 22:53 xdir

看起来压缩成功了,但是上面有一个报错:tar: Removing leading ‘/’ from member names,这是因为 tar 命令在压缩文件时,默认会取相对路径,不会取从根路径下来的绝对路径。所以,如果待压缩的路径是绝对路径,便会报该错误。如果确定自己要使用绝对路径,要加上参数 -P

➜ tar -zcvf abs.tar.gz -P /Users/yindongliang/test/tarfile/hello.txt /Users/yindongliang/test/tarfile/world.txt
a /Users/yindongliang/test/tarfile/hello.txt
a /Users/yindongliang/test/tarfile/world.txt
➜ tar -tzvf abs.tar.gz
-rw-r--r--  0 yindongliang staff       6 Mar 13 18:06 /Users/yindongliang/test/tarfile/hello.txt
-rw-r--r--  0 yindongliang staff       6 Mar 13 18:07 /Users/yindongliang/test/tarfile/world.txt

假设生产环境这个 abs.tar.gz 很大,而且里面有很多压缩文件,我只能解压其中我需要的一个特定文件,如何做呢:

➜ tar -xzvf abs.tar.gz -P /Users/yindongliang/test/tarfile/hello.txt
x /Users/yindongliang/test/tarfile/hello.txt
➜ ls
abs.tar.gz hello.txt  xdir

故解压时也可以带 -P 来指定是绝对路径。

相对路径 #

问题来了,如果我们在压缩绝对路径的文件时,还没有指定 -P 参数,这意味着生成的压缩文件的内容列表的路径看起来比较别扭(如下),正常情况下可能自己不会这么用,但是总有可能你会用到别人这样的压缩文件。

➜ tar -zcvf abs.tar.gz /Users/yindongliang/test/tarfile/hello.txt /Users/yindongliang/test/tarfile/world.txt
tar: Removing leading '/' from member names
a Users/yindongliang/test/tarfile/hello.txt
a Users/yindongliang/test/tarfile/world.txt

要解压这样的压缩文件,同时不想在当前路径下生成嵌套过深的文件夹,可以使用 --strip-components 参数。tar 命令的 --strip-components 参数用于在解压缩文件时剥离文件名中指定的前缀目录,不管是带有相对路径还是绝对路径的文件路径都可以使用。

➜ tar -xzvf abs.tar.gz --strip-components=4 -C ./xdir
x hello.txt
x world.txt
➜ ls xdir
hello.txt world.txt

上面已经提到过,参数 -C 可以帮我们指定文件夹。

参考 #

本文借助 Notion AI 提供帮助。

本文共 1626 字,上次修改于 Jan 5, 2024,以 CC 署名-非商业性使用-禁止演绎 4.0 国际 协议进行许可。

相关文章

» I/O 多路复用机制

» 操作系统的文件系统

» Vagrant 虚拟机 Ubuntu16.04 安装 MariaDB

» Ubuntu 下部署 Django 应用