Linux基础:tar命令选项实用小技巧

这篇文章介绍一下tar命令的两个参数在使用中的小技巧。

情景

以docker目前最新的一个稳定版本的压缩tgz文件为例,压缩文件展开会有一个docker目录,如果希望这个tgz文件直接展开到一个已经存在的名为docker的目录下(比如/tmp/docker),一般的做法是tar xf展开后再使用mv操作,执行的时候就会发现一个很有趣的事情,就是docker目录下有一个docker的文件,然后在docker的目录下试图将这个docker的文件移动至此文件的父目录中,会发生什么情况,可自行试一下就会知道。

情景展开

上述的说明表明了一件事情,就是非常简单的事情也很难说明白,接下来直接使用代码进行说明:

[root@liumiaocn tmp]# ls docker-19.03.5.tgz 
docker-19.03.5.tgz
[root@liumiaocn tmp]# tar tvf docker-19.03.5.tgz 
drwxrwxr-x ubuntu/ubuntu     0 2019-11-13 02:30 docker/
-rwxr-xr-x ubuntu/ubuntu 764144 2019-11-13 02:30 docker/docker-init
-rwxr-xr-x ubuntu/ubuntu 65641786 2019-11-13 02:30 docker/docker
-rwxr-xr-x ubuntu/ubuntu 72090824 2019-11-13 02:30 docker/dockerd
-rwxr-xr-x ubuntu/ubuntu  8649792 2019-11-13 02:30 docker/runc
-rwxr-xr-x ubuntu/ubuntu 18850136 2019-11-13 02:30 docker/ctr
-rwxr-xr-x ubuntu/ubuntu  2877369 2019-11-13 02:30 docker/docker-proxy
-rwxr-xr-x ubuntu/ubuntu 34625816 2019-11-13 02:30 docker/containerd
-rwxr-xr-x ubuntu/ubuntu  6116160 2019-11-13 02:30 docker/containerd-shim
[root@liumiaocn tmp]# 
[root@liumiaocn tmp]# mkdir docker
[root@liumiaocn tmp]# ls docker
[root@liumiaocn tmp]# 

问题就是/tmp/docker这个目录已经存在,展开到到这个目录下,缺省方式下会有docker的目录,如果不希望有这层多余的目录,可执行文件直接在/tmp/docker下,如果不使用tar命令的特定选项-C和strip-components的话就只能这样。

[root@liumiaocn tmp]# cd docker
[root@liumiaocn docker]# tar xf ../docker-19.03.5.tgz 
[root@liumiaocn docker]# ls 
docker
[root@liumiaocn docker]# ls docker/
containerd  containerd-shim  ctr  docker  dockerd  docker-init  docker-proxy  runc
[root@liumiaocn docker]# 
[root@liumiaocn docker]# mv docker/* .
mv: overwrite ‘./docker’? y
mv: cannot overwrite directory ‘./docker’ with non-directory
[root@liumiaocn docker]# ls
containerd  containerd-shim  ctr  docker  dockerd  docker-init  docker-proxy  runc
[root@liumiaocn docker]# ls docker
docker
[root@liumiaocn docker]#

然后发现目录和文件同名,删除一层就很麻烦了,可以这样做

[root@liumiaocn docker]# mv docker/docker docker/dockertmp
[root@liumiaocn docker]# mv docker/dockertmp .
[root@liumiaocn docker]# rm -r docker
rm: remove directory ‘docker’? y
[root@liumiaocn docker]# mv dockertmp docker
[root@liumiaocn docker]# ls
containerd  containerd-shim  ctr  docker  dockerd  docker-init  docker-proxy  runc
[root@liumiaocn docker]# 

解决方法

替代命令:tar xzvf docker-19.03.5.tgz -C /tmp/docker --strip-components=1

[root@liumiaocn tmp]# ls docker-19.03.5.tgz 
docker-19.03.5.tgz
[root@liumiaocn tmp]# ls docker
[root@liumiaocn tmp]# tar xzvf docker-19.03.5.tgz -C /tmp/docker --strip-components=1
docker/docker-init
docker/docker
docker/dockerd
docker/runc
docker/ctr
docker/docker-proxy
docker/containerd
docker/containerd-shim
[root@liumiaocn tmp]# ls docker
containerd  containerd-shim  ctr  docker  dockerd  docker-init  docker-proxy  runc
[root@liumiaocn tmp]#
发布了1058 篇原创文章 · 获赞 1292 · 访问量 399万+

猜你喜欢

转载自blog.csdn.net/liumiaocn/article/details/104125958
今日推荐