客户端将文件上传到开发服务器。当需要将项目上传到生产服务器时,这些文件不再需要,我们希望将它们从最终推送到生产的 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
成功案例:
如果给出完整路径来进行备份,则在排除时也应该使用完整路径。
tar -zcvf /opt/ABC/BKP_27032020/backup_27032020.tar.gz \ --exclude='/opt/ABC/csv/*' \ --exclude='/opt/ABC/log/*' \ /opt/ABC
如果给出当前路径来进行备份,在排除时也应该只使用当前路径。
tar -zcvf backup_27032020.tar.gz \ --exclude='ABC/csv/*' \ --exclude='ABC/log/*' \ ABC
失败案例:
如果给出当前路径目录进行备份并忽略完整路径,则它将不起作用
tar -zcvf /opt/ABC/BKP_27032020/backup_27032020.tar.gz \ --exclude='/opt/ABC/csv/*' \ --exclude='/opt/ABC/log/*' \ ABC
注意:提到排除备份目录之前/之后都是可以的。
答案4
将您不需要的目录(例如dir_A
和dir_B
)放入文件中:
echo dir_A > FILE
echo dir_B >> FILE
tar -cvf file_name.tar --exclude-from=FILE directory/