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

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

我有一个需要存档的目录,其中包含许多我不需要备份的非常大的文件的子目录。

不完全解决方案:

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

我还可以使用查找命令创建文件列表并排除我不想存档的文件,并将列表传递给tar,但这只适用于少量文件。我有几万。

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

有人能想到一个更好/更有效的解决方案吗?

编辑:Charles Ma的解决方案运行良好。最大的问题是--exclude='./folder'必须位于tar命令的开头。完整命令(cd优先,因此备份相对于该目录):

cd /folder_to_backuptar --exclude='./folder' --exclude='./upload/folder2' -zcvf /backup/filename.tgz .
1171328 次浏览

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

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

您最好的选择是通过xargs将查找与tar一起使用(以处理大量参数)。例如:

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

您可以为tar排除带有--exclude的目录。

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

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

在你的情况下,也许像

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

您可以对tar有多个排除选项,因此

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

etc将工作。使当然放置--exclude之前源和目标项目。

您可以使用cpio(1)来创建tar文件。cpio将文件存档到stdin上,因此如果您已经找到了要用于选择存档文件的查找命令,请将其通过管道传输到cpio以创建tar文件:

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

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

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

为了避免在处理数以万计的文件时由于使用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 pathsfind "$(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 -

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

  • #删除文件
  • --排除-标记-全部=文件
  • --排除-标记-下=文件

承载指定FILE的文件夹将被排除在外。

使用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

可能的冗余答案,但因为我发现它很有用,这里是:

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

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

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

欧元0.02

我没有运气让tar排除几级深的5GB子目录。最后,我只是使用了unix Zip命令。它对我来说工作起来容易得多。

因此,对于原始帖子中的这个特定示例

相当于:

zip-r /backup/filename.zip。-x上传/文件夹/**\*上传/文件夹2/**\*

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

我经历过,至少在我使用的tar的Cygwin版本(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

没有工作:

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

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

tar [OPTION...] [FILE]

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

最好的RGDS

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

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

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

如果你有以下结构

/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=详细(您可以在输入文件时看到它们,这有助于确保没有添加您排除的文件)。和f=file。

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

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

请注意,排除的文件/文件夹相对于tar的根目录(我已经尝试了相对于/的完整路径,但我无法使其工作)。

希望这能帮助别人(下次我谷歌它)

读完这篇文章后,我在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/*'

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

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

您可以使用标准的“ant符号”来排除相对目录。
这适用于我,不包括任何. 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

我同意--排除标志是正确的方法。

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

警告来表示我没有立即发现明显的副作用:在本例中排除'fileA'将搜索'fileA'反复!

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

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

  • 为了避免这个问题,请确保给出整个路径,例如--exclude='./dirA/data.txt'

去看看吧

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

下面的bash脚本应该可以做到这一点。它使用Marcus Sundman给出的答案这里

#!/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.gzexcludes=`find $pathin -iname "*.CC" -exec echo "--exclude \'{}\'" \;|xargs`echo $pathin
echo tar -czvf $nam.tar.gz $excludes $pathin

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

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

编辑

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

对于Mac OSX我必须做的

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

注意--exclude=之后的-f

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

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

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

Tar --version

tar(GNU tar)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 *

在阅读了不同版本的所有这些好答案并为自己解决了这个问题之后,我认为有非常小的细节非常重要,并且很少用于GNU/Linux一般用途,这还不够强调,值得评论。

所以我不会尝试回答每个案例的问题,而是尝试在事情不起作用时注册哪里看

非常重要的是要注意:

  1. 选项的顺序很重要:在文件选项和要备份的目录之前和之后放置--排除是不一样的。这至少对我来说是出乎意料的,因为根据我的经验,在GNU/Linux命令中,选项的顺序通常并不重要。
  2. 例如,不同的tar版本以不同的顺序期望此选项:表示在GNU tar v 1.26和1.28中,排除项排在最后,而在我的情况下,在GNU tar 1.29中,情况正好相反。
  3. 拖尾伤很重要:至少在GNU tar 1.29中,它不应该是任何

在我的例子中,对于Debian扩展上的GNU tar 1.29,有效的命令是

tar --exclude="/home/user/.config/chromium" --exclude="/home/user/.cache" -cf file.tar  /dir1/ /home/ /dir3/

引语并不重要,它有或没有它们。

我希望这对某人有用。

我想在localhost上有新鲜的前端版本(角文件夹)。此外,git文件夹在我的情况下很大,我想排除它。我需要从服务器下载它,并解压它以运行应用程序。

从 /var/lib/tomcat7/webapps压缩角文件夹,将其移动到名称为angular.23.12.19.tar.gz的 /tmp文件夹

命令:

tar --exclude='.git' -zcvf /tmp/angular.23.12.19.tar.gz /var/lib/tomcat7/webapps/angular/

成功案例:1)如果给全路径采取备份,在排除也应使用全路径。

Tar-zcvf /opt/ABC/BKP_27032020/backup_27032020.tar.gz/选择/ABC/日志/ /opt/ABC

2)如果给当前路径采取备份,在排除时也应只用当前路径。

tar-zcvfbackup_27032020.tar.gz--排除='ABC/csv///删除日志//'ABC

失败案例:

  1. 如果给当前路径目录以备份和完整路径以忽略,则不起作用

    tar-zcvf /opt/ABC/BKP_27032020/backup_27032020.tar.gz-排除/选择/ABC/csv//选择/ABC/日志/'ABC

注意:在备份目录之前/之后提及排除是可以的。

如果您试图排除版本控制系统(VCS)文件,tar已经支持两个有趣的选项!:)

  1. 选项:#排除vcs

此选项不包括以下版本控制系统使用的文件和目录:CVSRCSSCCSSVNArchBazaarMercurialDarcs

从1.32版开始,排除了以下文件:

  • CVS/和它下面的一切
  • RCS/和它下面的一切
  • SCCS/和它下面的一切
  • .git/和它下面的一切
  • .gitignore
  • .gitmodules
  • .gitattributes
  • .cvsignore
  • .svn/和它下面的一切
  • .arch-ids/和它下面的一切
  • {arch}/和它下面的一切
  • =RELEASE-ID
  • =meta-update
  • =update
  • .bzr
  • .bzrignore
  • .bzrtags
  • .hg
  • .hgignore
  • .hgrags
  • _darcs

    1. 选项:--排除-vc s-忽略

在归档某些版本管理系统(VCS)下的目录时,通常可以方便地从该VCS的忽略文件(例如.cvsignore.gitignore等)中读取排除模式。

在归档目录之前,请查看它是否包含以下任何文件:cvsignore.gitignore.bzrignore.hgignore。如果是,请从这些文件中读取忽略模式。

这些模式的处理方式与相应的VCS处理它们的方式一样,即:

.cvsignore

包含仅适用于此文件所在目录的shell样式全局模式。文件中不允许任何注释。空行被忽略。

.gitignore

包含shell样式的全局模式。适用于.gitfile所在的目录及其所有子目录。

任何以#开头的行都是注释。反斜杠转义注释字符。

.bzrignore

包含shell全局模式和正则表达式(如果前缀为RE:(16))。模式影响目录及其所有子目录。

任何以#开头的行都是注释。

.hgignore

包含Posix正则表达式(17)。第0行切换到shell全球模式。第1行切换回来。注释以#开头。模式影响目录及其所有子目录。

  1. 示例

tar -czv --exclude-vcs --exclude-vcs-ignores -f path/to/my-tar-file.tar.gz path/to/my/project/

我想展示另一个选项,我用它来获得与之前提供的答案相同的结果,我有一个类似的案例,我想将Android工作室项目全部备份到tar文件中以上传到media fire,使用du命令查找大文件,我发现我不需要一些目录,如:构建、linux和dart_tools使用Charles_ma的第一个答案,我稍微修改了一下,以便能够从我的Android目录的父目录运行命令。

tar --exclude='*/build' --exclude='*/linux' --exclude='*/.dart_tool' -zcvf androidProjects.tar Android/

它像一个魅力。

PS。对不起,如果这种答案是不允许的,如果是这种情况,我会删除。

似乎不可能排除目录绝对路径。一旦任何路径是绝对的(源或/和排除),排除命令将不起作用。这是我尝试所有可能组合后的经验。