首页 文章

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

提问于
浏览
628

是否有一个简单的shell命令/脚本支持排除某些文件/文件夹被存档?

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

Not quite solutions:

tar --exclude=PATTERN 命令与给定模式匹配并排除这些文件,但我需要忽略特定文件和文件夹(完整文件路径),否则可能会排除有效文件 .

我还可以使用find命令创建文件列表并排除我不想存档的文件并将列表传递给tar,但这仅适用于少量文件 . 我有成千上万 .

我开始认为唯一的解决方案是创建一个包含要排除的文件/文件夹列表的文件,然后使用rsync和 --exclude-from=file 将所有文件复制到tmp目录,然后使用tar来存档该目录 .

任何人都可以想到更好/更有效的解决方案吗?

编辑: cma 的解决方案运作良好 . 最重要的是 --exclude='./folder' MUST 位于tar命令的开头 . 完整命令(cd首先,所以备份是相对于该目录):

cd /folder_to_backup
tar --exclude='./folder' --exclude='./upload/folder2' -zcvf /backup/filename.tgz .

23 回答

  • 12

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

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

    tar cvpzf abc.tgz abc/ --exclude='abc/error' --exclude='abc/logs'
    

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

    tar cvpzf abc.tgz abc/ --exclude='abc/error/*' --exclude='abc/logs/*'
    
  • 51

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

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

  • 0

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

    如果你有以下结构

    /home/ftp/mysite/
    

    使用以下文件/文件夹

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

    所以,你想制作一个包含/ home / ftp / mysite内部所有内容的tar文件(将网站移动到新服务器),但 file3 只是垃圾, folder3 中的所有内容也不需要,所以我们将跳过这些二 .

    我们使用这种格式

    tar -czvf <name of tar file> <what to tar> <any excludes>
    

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

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

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

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

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

  • -1

    您可以使用 --exclude 排除tar目录 .

    如果要存档除 /usr 之外的所有内容,您可以使用:

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

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

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

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

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

    您可以使用标准"ant notation"来相对排除目录 .
    这对我有用,并且不包括任何.git或node_module目录 .

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

    myInputFile.txt包含:

    / DEV2 / JAVA
    / DEV2 / JavaScript的

  • 4

    看看这个

    tar cvpzf zip_folder.tgz . --exclude=./public --exclude=./tmp --exclude=./log --exclude=fileName
    
  • 16

    我同意--exclude标志是正确的方法 .

    $ tar --exclude='./folder_or_file' --exclude='file_pattern' --exclude='fileA'
    

    warning 的一个单词副作用,我没有立即发现:在此示例中排除'fileA'将搜索'fileA' RECURSIVELY!

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

    data.txt
    config.txt
    --+dirA
      |  data.txt
      |  config.docx
    
    • 如果使用 --exclude='data.txt' ,存档将不包含 EITHER data.txt文件 . 如果存档第三方库(例如node_modules目录),这可能会导致意外结果 .

    • 要避免此问题,请确保提供整个路径,例如 --exclude='./dirA/data.txt'

  • 2

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

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

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

    Tar --version
    

    焦油(GNU焦油)1.27.1

    有效的命令语法:

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

    这些不起作用:

    $ 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 *
    
  • 14

    以下bash脚本应该可以解决问题 . 它使用了Marcus Sundman给出的答案here .

    #!/bin/bash
    
    echo -n "Please enter the name of the tar file you wish to create with out extension "
    read nam
    
    echo -n "Please enter the path to the directories to tar "
    read pathin
    
    echo tar -czvf $nam.tar.gz
    excludes=`find $pathin -iname "*.CC" -exec echo "--exclude \'{}\'" \;|xargs`
    echo $pathin
    
    echo tar -czvf $nam.tar.gz $excludes $pathin
    

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

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

    编辑

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

  • 4

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

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

    您可以使用cpio(1)来创建tar文件 . cpio将文件存档在stdin上,所以如果你已经想到了输出要用于选择存档文件的find命令,将其输入cpio以创建tar文件:

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

    我已经体验过,至少我使用的是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"),选项顺序很重要 .

    虽然这种结构对我有用:

    tar cfvz target.tgz --exclude='<dir1>' --exclude='<dir2>' target_dir
    

    那个 didn't 工作:

    tar cfvz --exclude='<dir1>' --exclude='<dir2>' target.tgz target_dir
    

    这个,而 tar --help 揭示了以下内容:

    tar [OPTION...] [FILE]
    

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

    最好的rgds,

  • 2

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

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

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

    我的全部观点是,有必要(通过放置 ./ )来指定tar被复制的更大目录的一部分的排除目录 .

    我的€0.02

  • 0

    我没有运气得到tar来排除几个级别的5千兆字节子目录 . 最后,我只使用了unix Zip命令 . 它对我来说更容易 .

    所以对于这个特殊的例子来自原帖
    (tar --exclude = './folder' --exclude = './upload/folder2' -zcvf /backup/filename.tgz . )

    相当于:

    zip -r /backup/filename.zip . -x upload / folder / ** \ * upload / folder2 / ** \ *

    (注意:这是我最初使用的帖子,帮助了我https://superuser.com/questions/312301/unix-zip-directory-but-excluded-specific-subdirectories-and-everything-within-t

  • 10

    对于Mac OSX,我必须这样做

    tar -zcv --exclude='folder' -f theOutputTarFile.tar folderToTar

    注意 --exclude= 之后的 -f

  • 5

    为了避免由于在处理成千上万个文件时使用 find ... | xargs ... 而导致的 'xargs: Argument list too long' 错误,您可以使用 find ... -print0 | tar --null ...find 的输出直接传递给 tar .

    # archive a given directory, but exclude various files & directories 
    # 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 -
       #bsdtar --null -n -czf archive.tar.gz -T -
    
  • 5

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

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

    等会起作用 . 使 sure--exclude before 放入源和目标项 .

  • 799

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

    • --exclude-tag = FILE

    • --exclude-tag-all = FILE

    • --exclude-tag-under = FILE

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

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

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

  • 1

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

    使用多种模式排除文件

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

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

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

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

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

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

    tar zc --exclude __MACOSX --exclude .DS_Store -f <archive> <source(s)>
    

相关问题