Tar:创建归档文件,排除除一个之外的所有目录

12

我有一些带有文件的目录

dir_archive/somedir1
dir_archive/somedir2
dir_archive/somedir3
dir_archive/mydir
dir_archive/mydir/excludedir1
dir_archive/mydir/excludedir2
dir_archive/mydir/excludedir3
dir_archive/mydir/many_other_directories...
dir_archive/mydir/my_archive_dir

我想要创建一个tar(gz)归档文件dir_archive.tar.gz,其中包含所有文件和目录,但排除某些内容。

dir_archive/mydir/excludedir1
dir_archive/mydir/excludedir2
dir_archive/mydir/excludedir3
dir_archive/mydir/many_other_directories...
但要包括。
dir_archive/mydir/my_archive_dir

我不想为每个目录使用--exclude

tar cvfz dir_archive.tar.gz --exclude=dir_archive/mydir/excludedir1 --exclude=dir_archive/mydir/excludedir2 --exclude=dir_archive/mydir/excludedir3

我尝试使用--add-file,但它不起作用:

tar cvfz dir_archive.tar.gz --exclude=dir_archive/mydir --add-file=dir_archive/mydir/my_archive_dir dir_archive

有没有简单的方法?谢谢

2个回答

20
一种方法是先排除mydir,然后再附加my_archive_dir
tar cvf dir_archive.tar --exclude=dir_archive/mydir dir_archive
tar rvf dir_archive.tar dir_archive/mydir/my_archive_dir
gzip dir_archive.tar

很遗憾,在压缩文件中无法使用追加。

--exclude选项需要一个模式作为参数,因此如果要排除的目录名称相似,则可以避免它们并仍然包括归档目录。

tar cvfz dir_archive.tar.gz --exclude=dir_archive/mydir/exclude* dir_archive

你也可以通过创建包含所有需要被打包的文件名的文件,然后将该文件列表和选项-T--files-from一起传递给tar(或者类似的方式列出需要被排除的文件并将列表与选项-X一起传递)。

filelist.txt:
dir_archive
dir_archive/temp1
dir_archive/mydir
dir_archive/mydir/temp2
dir_archive/mydir/my_archive_dir
dir_archive/mydir/my_archive_dir/temp7
tar cvfz dir_archive.tar.gz --no-recursion --files-from filelist.txt

感谢您提供详尽的答案。 - kubedan
1
注意,tar在-X输入中每行隐式地放置一个*;dir_archive将匹配dir_archive/dir_archive,这可能是个大问题。 - rcreswick

1

顺序很重要:

$ mkdir -p dir_archive/{somedir{1..3},mydir/{excludedir{1..3},otherone,my_archive_dir}}
$ touch dir_archive/{somedir{1..3},mydir/{excludedir{1..3},otherone,my_archive_dir}}/dir_file.txt
$ tar cvzf dir_archive.tar.gz dir_archive/mydir/my_archive_dir* --exclude "dir_archive/mydir/*" dir_archive
dir_archive/mydir/my_archive_dir/
dir_archive/mydir/my_archive_dir/dir_file.txt
dir_archive/
dir_archive/mydir/
dir_archive/somedir2/
dir_archive/somedir2/dir_file.txt
dir_archive/somedir1/
dir_archive/somedir1/dir_file.txt
dir_archive/somedir3/
dir_archive/somedir3/dir_file.txt

本质上,这样做更加明确,然后将排除应用于父目录。从https://unix.stackexchange.com/a/417707/420501无耻地窃取。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接