我有一些带有一些文件的目录
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
存在一些简单的方法吗?感谢
答案 0 :(得分: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
答案 1 :(得分:0)
订单很重要:
$ 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
从本质上讲,这是在做更明确的事情,然后将排除项仅应用于父目录。