【问题标题】:Tar: create archive exclude directories except oneTar:创建存档排除目录,除了一个
【发布时间】:2012-04-30 22:57:37
【问题描述】:

我有一些包含一些文件的目录

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

存在一些简单的方法吗?谢谢

【问题讨论】:

    标签: unix gzip archive tar


    【解决方案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盗取

    【讨论】:

      【解决方案2】:

      一种方法是首先排除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
      

      还可以创建一个文件,其中包含您想要包含的所有文件的名称,并将该列表提供给 tar 选项 -T--files-from(或以类似方式列出要排除的文件并给出带有选项-X 的列表。

      文件列表.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
      

      【讨论】:

      • 感谢您提供详尽的解答
      • 当心,tar 在 -X 输入的每一行之前隐式放置一个 *; dir_archive 将匹配 dir_archive/dir_archive,这可能很重要。
      猜你喜欢
      • 1970-01-01
      • 2021-07-31
      • 2017-01-23
      • 1970-01-01
      • 2017-04-20
      • 2014-01-17
      • 1970-01-01
      • 1970-01-01
      • 2013-12-27
      相关资源
      最近更新 更多