Shell命令到tar目录,不包括某些文件/文件夹


坚挺的阿袁
2025-02-06 10:32:10 (24天前)
  1. 有一个简单的外壳


命令
</跨度>
/脚本支持排除某些文件/文件夹被存档?

我有一个目录需要使用子目录进行存档,该子目录包含许多我不需要备份的非常大的文件。

不完全解决方案:

tar —exclude = PATTERN

命令
</跨度>
匹配给定的模式并排除这些文件,但我需要特定的文件&amp;要忽略的文件夹(完整的)

23 条回复
  1. 0# 楊♡ | 2019-08-31 10-32



    有许多答案的老问题,但我发现没有一个对我来说足够清楚,所以我想加我的尝试。



    如果你有以下结构




    1. /home/ftp/mysite/

    2. </code>


    使用以下文件/文件夹




    1. /home/ftp/mysite/file1
      /home/ftp/mysite/file2
      /home/ftp/mysite/file3
      /home/ftp/mysite/folder1
      /home/ftp/mysite/folder2
      /home/ftp/mysite/folder3

    2. </code>


    所以,你想制作一个包含/ home / ftp / mysite内部所有内容的tar文件(将网站移动到新服务器),但是

    file3

    只是垃圾,一切都在

    folder3

    也不需要,所以我们将跳过这两个。



    我们使用的格式




    1. tar -czvf

    2. </code>


    其中c = create,z = zip和v = verbose(您可以在输入文件时看到这些文件,确保您添加的文件都没有被添加)。和f =文件。



    所以,我的命令看起来像这样




    1. cd /home/ftp/
      tar -czvf mysite.tar.gz mysite exclude=’file3 exclude=’folder3

    2. </code>


    请注意,排除的文件/文件夹相对于tar的根目录(我在这里尝试了相对于/的完整路径,但我无法做到这一点)。



    希望这会帮助某人(我下次谷歌时也会这样)


  2. 1# 易米烊光 | 2019-08-31 10-32



    您可以使用cpio(1)来创建tar文件。 cpio将文件存储在stdin上,所以如果你已经找到了想要用来选择存档文件的find命令,请将它传递给cpio来创建tar文件:




    1. find | cpio -o -H ustar | gzip -c > archive.tar.gz

    2. </code>

  3. 2# 淋了一整夜的雨 | 2019-08-31 10-32



    为了避免可能

    ‘xargs: Argument list too long’

    因使用而导致的错误

    find … | xargs …

    处理成千上万的文件时,可以管道输出

    find

    直接到

    tar

    运用

    find … -print0 | tar —null …




    1.   # archive a given directory, but exclude various files & directories 
    2. specified by their full file paths

      find $(pwd -P)” -type d ( -path ‘/path/to/dir1 -or -path ‘/path/to/dir2 ) -prune \
      -or -not ( -path ‘/path/to/file1 -or -path ‘/path/to/file2 ) -print0 |
      gnutar null no-recursion -czf archive.tar.gz files-from -

    3. bsdtar null -n -czf archive.tar.gz -T -

      </code>

  4. 3# Let us fly | 2019-08-31 10-32



    可能多余的答案,但因为我觉得它很有用,这里是:



    虽然FreeBSD root(即使用csh)我想将我的整个根文件系统复制到/ mnt但没有/ usr和(显然)/ mnt。这是有效的(我在/):




    1. tar exclude ./usr exclude ./mnt create file - . (cd /mnt && tar xvd -)

    2. </code>


    我的全部观点是,有必要(通过投入

    ./
    </强>
    ) 至

    指定

    tar,将被复制的更大目录的一部分放在被排除的目录中。



    我的0.02


  5. 4# v-star*위위 | 2019-08-31 10-32



    此排除模式处理文件名后缀,如png或mp3以及目录名称,如.git和node_modules




    1. tar exclude={.png,.mp3,*.wav,.git,node_modules} -Jcf ${target_tarball} ${source_dirname}

    2. </code>

  6. 5# 只怕再见是故人 | 2019-08-31 10-32



    你最好的办法是使用find和tar,通过xargs(来处理大量的参数)。例如:




    1. find / -print0 | xargs -0 tar cjf tarfile.tar.bz2

    2. </code>

  7. 6# ࿏自ོ༾由ོ༽人͙⃡⌇ | 2019-08-31 10-32



    我同意—exclude标志是正确的方法。




    1. $ tar exclude=’./folder_or_file exclude=’file_pattern exclude=’fileA

    2. </code>


    一句话

    警告
    </强>
    为了副作用,我没有立即发现:
    在此示例中排除’fileA’将搜索’fileA’

    递归!
    </强>



    示例:包含单个子目录的目录,该子目录包含同名文件(data.txt)




    1. data.txt
      config.txt
      —+dirA
      | data.txt
      | config.docx

    2. </code>




    • 如果使用

      —exclude=’data.txt’

      档案将不包含

      无论是
      </强>
      data.txt文件。如果归档第三方库(例如node_modules目录),这可能会导致意外结果。





    • 要避免此问题,请确保提供整个路径,例如

      —exclude=’./dirA/data.txt’




  8. 7# 日耀九洲 | 2019-08-31 10-32



    将find命令与tar append(-r)选项一起使用。这样,您可以在一个步骤中将文件添加到现有tar,而不是两个通过的解决方案(创建文件列表,创建tar)。




    1. find /dir/dir -prune -o etc etc…. -exec tar rvf ~/tarfile.tar {} \;

    2. </code>

  9. 8# 撩心 | 2019-08-31 10-32




    1. tar -cvzf destination_folder source_folder -X /home/folder/excludes.txt

    2. </code>


    -X表示包含必须从备份中排除的文件名列表的文件。对于Instance,您可以在此文件中指定*〜,以便在备份中不包含任何以〜结尾的文件名。


  10. 9# 圈圈红 | 2019-08-31 10-32



    我已经经历过这种情况,至少我是这样的

    Cygwin的

    我正在使用的tar版本(Windows XP Home Edition SP3机器上的“CYGWIN_NT-5.1 1.7.17(0.262 / 5/3)2012-10-19 14:39 i686 Cygwin”),选项顺序很重要。



    虽然这种结构对我有用:




    1. tar cfvz target.tgz exclude=’ exclude=’ target_dir

    2. </code>


    那个

    没有
    </强>
    工作:




    1. tar cfvz exclude=’ exclude=’ target.tgz target_dir

    2. </code>


    这一点,而

    tar —help

    揭示以下内容:




    1. tar [OPTION…] [FILE]

    2. </code>


    所以,第二个命令也应该有效,但显然情况似乎并非如此……



    最好的rgds,


  11. 10# 不想吃东西 | 2019-08-31 10-32



    您可以使用标准的“ant notation”来排除相对目录。

    这对我有用,并且不包括任何.git或node_module目录。




    1. tar -cvf myFile.tar exclude=/.git/* exclude=/node_modules/* -T /data/txt/myInputFile.txt 2> /data/txt/myTarLogFile.txt

    2. </code>


    myInputFile.txt包含:


    / DEV2 / JAVA

    / DEV2 / JavaScript的


  12. 11# نسر الصحراء | 2019-08-31 10-32



    使用tar从备份中排除文件/目录的可能选项:



    使用多种模式排除文件




    1. tar -czf backup.tar.gz exclude=PATTERN1 exclude=PATTERN2 /path/to/backup

    2. </code>


    使用填充了模式列表的排除文件排除文件




    1. tar -czf backup.tar.gz -X /path/to/exclude.txt /path/to/backup

    2. </code>


    通过将标记文件放在应跳过的任何目录中,使用标记排除文件




    1. tar -czf backup.tar.gz exclude-tag-all=exclude.tag /path/to/backup

    2. </code>

  13. 12# 故人 | 2019-08-31 10-32



    看看这个




    1. tar cvpzf zip_folder.tgz . exclude=./public exclude=./tmp exclude=./log exclude=fileName

    2. </code>

  14. 13# 不丶离 | 2019-08-31 10-32



    gnu tar v 1.26 —exclude需要在归档文件和备份目录参数之后,应该没有前导或尾部斜杠,并且不需要引号(单引号或双引号)。所以相对于要备份的PARENT目录,它是:




    tar cvfz /path_to/mytar.tgz ./dir_to_backup —exclude=some_path/to_exclude


  15. 14# 滔滔江水 | 2019-08-31 10-32



    您可以为tar设置多个排除选项




    1. $ tar exclude=’./folder exclude=’./upload/folder2 -zcvf /backup/filename.tgz .

    2. </code>


    等会工作。使

    当然
    </强>
    放在

    —exclude


    之前
    </强>
    源和目标项目。


  16. 15# 咿呀哟 | 2019-08-31 10-32



    对于Mac OSX,我必须这样做




    tar -zcv —exclude=’folder’ -f theOutputTarFile.tar folderToTar



    请注意

    -f

    之后

    —exclude=


  17. 16# 离线请留言 | 2019-08-31 10-32



    您可以使用排除目录

    —exclude

    对于焦油。



    如果要存档除外的所有内容

    /usr

    您可以使用:




    1. tar -zcvf /all.tgz / exclude=/usr

    2. </code>


    在你的情况下也许是这样的




    1. tar -zcvf archive.tgz arc_dir exclude=dir/ignore_this_dir

    2. </code>

  18. 17# ⑩Ⅵ嵗D夨憶 | 2019-08-31 10-32



    您还可以根据需要使用“—exclude-tag”选项之一:




    • —exclude标签= FILE

      1. - 排除标记 - 所有= FILE
      2. </LI>
      3. <LI>
      4. --exclude标签的下= FILE
      5. </LI>



    将排除托管指定FILE的文件夹。


  19. 18# v-star*위위 | 2019-08-31 10-32



    我在其他地方找到了这个,所以我不会信任,但它比我的mac特定问题上面的任何解决方案都更好(即使这是关闭的):




    1. tar zc exclude __MACOSX exclude .DS_Store -f

    2. </code>

  20. 19# 不见你 | 2019-08-31 10-32



    对于那些有问题的人来说,某些版本的tar只能在排除值中没有’./‘的情况下正常工作。




    1. Tar version

    2. </code>



    tar(GNU tar)1.27.1




    有效的命令语法:




    1. tar -czvf ../allfiles-butsome.tar.gz * exclude=acme/foo

    2. </code>


    这些不起作用:




    1. $ tar -czvf ../allfiles-butsome.tar.gz exclude=./acme/foo
      $ tar -czvf ../allfiles-butsome.tar.gz
      exclude=’./acme/foo
      $ tar exclude=./acme/foo -czvf ../allfiles-butsome.tar.gz
      $ tar exclude=’./acme/foo -czvf ../allfiles-butsome.tar.gz

      $ tar -czvf ../allfiles-butsome.tar.gz exclude=/full/path/acme/foo
      $ tar -czvf ../allfiles-butsome.tar.gz
      exclude=’/full/path/acme/foo
      $ tar exclude=/full/path/acme/foo -czvf ../allfiles-butsome.tar.gz
      $ tar exclude=’/full/path/acme/foo -czvf ../allfiles-butsome.tar.gz

    2. </code>

  21. 20# 一生浮华 | 2019-08-31 10-32



    读完这个帖子之后,我在RHEL 5上做了一些测试,这是我的结果,用于编写abc目录:



    这将排除目录错误和日志以及目录下的所有文件:




    1. tar cvpzf abc.tgz abc/ exclude=’abc/error exclude=’abc/logs

    2. </code>


    在排除目录之后添加通配符将排除文件但保留目录:




    1. tar cvpzf abc.tgz abc/ exclude=’abc/error/ exclude=’abc/logs/

    2. </code>

  22. 21# NetworkAttachedStorage | 2019-08-31 10-32



    以下bash脚本应该可以解决问题。它使用给出的答案

    这里

    作者:Marcus Sundman。



    1.   #!/bin/bash
    2. echo -n Please enter the name of the tar file you wish to create with out extension
      read nam

    3. echo -n Please enter the path to the directories to tar
      read pathin

    4. echo tar -czvf $nam.tar.gz
      excludes=find $pathin -iname "*.CC" -exec echo "--exclude \'{}\'" \;|xargs
      echo $pathin

    5. echo tar -czvf $nam.tar.gz $excludes $pathin

    6. </code>


    这将打印出您需要的命令,您只需将其复制并粘贴回来。可能有一种更优雅的方式将其直接提供给命令行。



    只需为要排除的任何其他常见扩展名,文件名或正则表达式更改 .CC,这仍然有用。



    编辑



    只是添加一点解释; find生成与所选正则表达式匹配的文件列表(在本例中为
    .CC)。此列表通过xargs传递给echo命令。这打印 - 从列表中排除’一个条目’。斜杠()是’标记的转义字符。


登录 后才能参与评论