如何使用 tar 排除某个目录的所有文件?

如何使用 tar 排除某个目录的所有文件?

客户端将文件上传到开发服务器。当需要将项目上传到生产服务器时,这些文件不再需要,我们希望将它们从最终推送到生产的 tar 文件中排除。但是,我们仍然希望保持目录完好无损,只有不需要的文件

使用 Ubuntu 16 和 tar 1.28,我们尝试过:

tar -vczf archive.tar.gz . --exclude=wp-content/uploads/wpallimport/files/*
tar: Cowardly refusing to create an empty archive

我们还尝试将 exclude= 参数括在单引号和双引号中,但没有成功。

tar -vczf archive.tar.gz . --exclude='wp-content/uploads/wpallimport/files/*'
tar: Cowardly refusing to create an empty archive

官方网站显示 --exclude 不带等号

tar -vczf file.tar.gz --exclude 'directory/*' .并给出同样的错误。

这是怎么做到的?

答案1

tar选项的常见问题--exclude相对于目录参数例如

$ tree dir
dir
└── subdir
    └── subsubdir
        ├── file1
        ├── file2
        └── file3

2 directories, 3 files

然后

$ tar cvf dir.tar.gz --exclude='/dir/subdir/subsubdir/*' dir
dir/
dir/subdir/
dir/subdir/subsubdir/
dir/subdir/subsubdir/file1
dir/subdir/subsubdir/file2
dir/subdir/subsubdir/file3

无法排除的内容subsubdir(它试图排除dir/dir/subdir/subsubdir/*,但与任何内容都不匹配);你想要的是

$ tar cvf dir.tar.gz --exclude='subdir/subsubdir/*' dir
dir/
dir/subdir/
dir/subdir/subsubdir/

据我所知,顺序并不重要,只是输出文件必须紧跟在f选项后面。

答案2

假设您有一个名为“top-dir”的目录,其中包含子文件夹“dir/subdir”。如果您想排除目录“dir/subdir”的内容但不排除目录本身,则实际有效的命令行是tar -zcp --exclude='dir/subdir/*' -f archive.tgz top-dir

您必须-f--exclude存档文件名之后和存档文件名之前使用开关。

答案3

成功案例:

  1. 如果给出完整路径来进行备份,则在排除时也应该使用完整路径。

    tar -zcvf /opt/ABC/BKP_27032020/backup_27032020.tar.gz \
    --exclude='/opt/ABC/csv/*' \
    --exclude='/opt/ABC/log/*' \
    /opt/ABC
    
  2. 如果给出当前路径来进行备份,在排除时也应该只使用当前路径。

    tar -zcvf backup_27032020.tar.gz \
    --exclude='ABC/csv/*' \
    --exclude='ABC/log/*' \
    ABC
    

失败案例:

  1. 如果给出当前路径目录进行备份并忽略完整路径,则它将不起作用

    tar -zcvf /opt/ABC/BKP_27032020/backup_27032020.tar.gz \
    --exclude='/opt/ABC/csv/*' \
    --exclude='/opt/ABC/log/*' \
    ABC
    

注意:提到排除备份目录之前/之后都是可以的。

答案4

将您不需要的目录(例如dir_Adir_B)放入文件中:

echo dir_A > FILE
echo dir_B >> FILE
tar -cvf file_name.tar --exclude-from=FILE directory/

相关内容