tar 命令中的绝对路径和相对路径使用注意 ByAI
3月 14, 2023
tar
命令是在 Linux 操作系统中用于打包和压缩文件的命令,先看下基本使用,然后再讨论相对路径和绝对路径的问题。
基本使用方法 #
压缩 #
要将多个文件打包成一个文件,可以使用以下命令:
tar -cvf {输出文件名} {要打包的文件1} {要打包的文件2} ...
其中,
c
选项表示创建一个新的压缩文件;v
选项表示显示详细的打包信息;f
选项表示指定要输出的文件名。
例如,要将文件 file1.txt
和 file2.txt
打包成一个名为 files.tar
的文件,可以使用以下命令:
tar -cvf files.tar file1.txt file2.txt
这将会在当前目录下创建一个名为 files.tar
的打包文件,其中包含 file1.txt
和 file2.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 提供帮助。