这篇文章介绍一下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]#
转载:https://blog.csdn.net/liumiaocn/article/details/104125958
查看评论