Bootstrap

Linux压缩命令tar之排除不需要的文件或者目录(--exclude)

tar 中–exclude的简单用法

# 首先创建一个如下的目录结构和测试文件
mydir/
├── myfile
├── zidir1
│   ├── file1
│   └── file2
├── zidira
│   └── filea
└── zidirA
    ├── fileA
    └── fileB

3 directories, 6 files

# 上面在 mydir 目录下有三个子目录 zidir1 和 zidira 、zidirA
# 子目录 zidir1 下有两个文件 file1 和 file2
# 子目录 zidira 下面有一个 filea
# 子目录 zidirA 下有两个文件 fileA 和 fileB

比如我本次压缩不需要 mydir 目录下的 zidir1zidirA两个子目录

# 使用 v 选项显示压缩详细信息,并没有将 zidir1 和 zidirA 压缩进压缩包
[root@aleng ~]# tar zcvf mydir1.tgz mydir/ --exclude=zidir1 --exclude=zidirA
mydir/
mydir/zidira/
mydir/zidira/filea
mydir/myfile
# 使用 t 选项查看压缩包中有什么内容,显示只有 mydir/zidira/filea 和 mydir/myfile
# zidir1 和 zidirA 目录以及目录下面的文件都没打包进来
[root@aleng ~]# tar tf mydir1.tgz 
mydir/
mydir/zidira/
mydir/zidira/filea
mydir/myfile

下面演示一个错误的示例

# 如果我们在 zidirA 目录后面加一个 / 那么 zidirA 也会压缩进压缩包。
# 注意:需要排除的目录后面不能有 / 。
[root@aleng ~]# tar zcvf mydir2.tgz mydir/ --exclude=zidir1 --exclude=zidirA/
mydir/
mydir/zidira/
mydir/zidira/filea
mydir/myfile
mydir/zidirA/
mydir/zidirA/fileB
mydir/zidirA/fileA

# 查看一下压缩包里面的内容, zidirA 目录和下面的文件都在压缩包里面。
[root@aleng ~]# tar tf mydir2.tgz 
mydir/
mydir/zidira/
mydir/zidira/filea
mydir/myfile
mydir/zidirA/
mydir/zidirA/fileB
mydir/zidirA/fileA

如果需要排除指定的文件可以这样处理

# 这里我不需要压缩 mydir/zidirA/fileA 这个文件文件,但是需要保留 mydir/zidirA/fileB
# 查看压缩详情,mydir/zidirA/fileA 不在压缩的内容里面
[root@aleng ~]# tar zcvf mydir3.tgz mydir/ --exclude=mydir/zidirA/fileA
mydir/
mydir/zidir1/
mydir/zidir1/file1
mydir/zidir1/file2
mydir/zidira/
mydir/zidira/filea
mydir/myfile
mydir/zidirA/
mydir/zidirA/fileB
# 查看一下压缩包里面的内容,压缩包里面没有 mydir/zidirA/fileA 文件
[root@aleng ~]# tar tf mydir3.tgz 
mydir/
mydir/zidir1/
mydir/zidir1/file1
mydir/zidir1/file2
mydir/zidira/
mydir/zidira/filea
mydir/myfile
mydir/zidirA/
mydir/zidirA/fileB

如果出现以下报错,说明 tar 的软件版本是tar (GNU tar) 1.30,需要将--exclude=提到-zcvf前面

tar: The following options were used after any non-optional arguments in archive create or update mode.  These options are positional and affect only arguments that follow them.  Please, rearrange them properly.
tar: --exclude ‘zidir1’ has no effect
tar: Exiting with failure status due to previous errors
# 下面是tar 1.30版本上的用法(在Centos 8 的系统版本中是tar默认版本是1.30,在Centos 7 的系统版本中是tar默认版本是1.26)
[root@aleng ~]# tar --exclude=zidir1 -zcvf mydir4.tgz mydir/
mydir/
mydir/zidira/
mydir/zidira/filea
mydir/myfile
mydir/zidirA/
mydir/zidirA/fileB
mydir/zidirA/fileA

查看tar的版本

[root@aleng ~]# tar --version
tar (GNU tar) 1.26
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by John Gilmore and Jay Fenlason.

[root@aleng ~]# tar --version
tar (GNU tar) 1.30
Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by John Gilmore and Jay Fenlason.

以上就是 --exclude 的一些简单用法和可能会踩的坑。

;