Shell 命令用于 tar 目录排除某些文件/文件夹[关闭]

2024-10-18 09:00:00
admin
原创
71
摘要:问题描述:是否有一个简单的 shell 命令/脚本支持排除某些文件/文件夹进行存档?我有一个目录需要存档,并且该子目录包含许多我不需要备份的非常大的文件。不完全是解决方案:该tar --exclude=PATTERN命令匹配给定的模式并排除那些文件,但我需要忽略特定的文件和文件夹(完整文件路径),否则可能会排...

问题描述:

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

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

不完全是解决方案:

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

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

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

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

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

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

解决方案 1:

你可以为 tar 设置多个排除选项,因此

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

等都可以。确保将其放在源项目和目标项目--exclude 之前。

解决方案 2:

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

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

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

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

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

解决方案 3:

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

解决方案 4:

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

如果你有以下结构

/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 的根目录的(我已尝试相对于 / 的完整路径,但无法使其工作)。

希望这能对某些人有帮助(下次我谷歌搜索时也会对我有帮助)

解决方案 5:

您可以使用标准“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

解决方案 6:

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

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

解决方案 7:

在阅读了所有针对不同版本的优秀答案并亲自解决了问题之后,我认为有一些非常重要的细节,而且对于 GNU/Linux 一般用途来说很少见,没有得到足够的强调,值得更多的评论。

因此,我不会尝试针对每种情况回答这个问题,而是尝试记录当事情不起作用时应该去哪里查找。

需要注意的是:

  1. 选项的顺序很重要:将 --exclude 放在要备份的文件选项和目录之前和之后是不一样的。这至少对我来说是意料之外的,因为根据我的经验,在 GNU/Linux 命令中,选项的顺序通常无关紧要。

  2. 不同的 tar 版本对这些选项的期望顺序不同:例如,@Andrew 的回答表明,在 GNU tar v 1.26 和 1.28 中,排除项排在最后,而就我而言,在 GNU tar 1.29 中,则相反。

  3. 尾随斜杠很重要:至少在 GNU tar 1.29 中,它不应该是任何

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

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

引号并不重要,有或没有引号都可以。

我希望这对某些人有用。

解决方案 8:

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

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

它非常有效。

附言:抱歉,如果不允许这种回答,我会删除。

解决方案 9:

我曾体验过,至少对于我使用的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

那个没有用:

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

这同时也tar --help揭示了以下事实:

tar [OPTION...] [FILE]

所以,第二条命令也应该有效,但显然事实并非如此......

祝一切顺利,

解决方案 10:

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

  1. 选项:--exclude-vcs

此选项排除以下版本控制系统使用的文件和目录:CVS、、、、、、、和。RCS`SCCSSVNArchBazaarMercurial`Darcs

从 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

2. 选项:**--exclude-vcs-ignores**

.cvsignore当归档某些版本控制系统 (VCS) 下的目录时,从该 VCS 的忽略文件 (例如,.gitignore等)中读取排除模式通常很方便。此选项提供了这种可能性。

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

这些模式的处理方式与相应的 VCS 的处理方式大致相同,即:

.cvsignore

包含仅适用于此文件所在目录的 shell 样式通配符模式。文件中不允许有注释。空行将被忽略。

.gitignore

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

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

.bzrignore

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

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

.hgignore

包含 posix 正则表达式(17)。该行syntax: glob切换到 shell 通配符模式。该行syntax: regexp切换回来。注释以 开头#。模式影响目录及其所有子目录。

  1. 例子

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

解决方案 11:

我在其他地方找到了这个,所以我不承担任何责任,但是对于我的 Mac 特定问题来说,它比上述任何解决方案都有效(即使它已经关闭):

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

解决方案 12:

对于 Mac OSX,我必须这样做

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

注意-f--exclude=

解决方案 13:

对于那些对此有疑问的人来说,某些版本的 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 *

解决方案 14:

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

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

对于我没有立即发现的明显的副作用,需要警告一句:在这个例子中排除“fileA”将会递归搜索“fileA”!

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

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

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

解决方案 15:

阅读完该帖子后,我在 RHEL 5 上做了一些测试,以下是我对 abc 目录进行 tar 的结果:

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

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

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

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

解决方案 16:

为了避免在处理数以万计的文件时'xargs: Argument list too long'由于使用而可能出现的错误,您可以将 的输出直接传输到使用 的管道中。find ... | xargs ...`findtarfind ... -print0 | tar --null ...`

# 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 \n   -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 -

解决方案 17:

将 find 命令与 tar append (-r) 选项结合使用。这样,您只需一步即可将文件添加到现有 tar,而不必经过两次操作(创建文件列表,创建 tar)。

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

解决方案 18:

您可以使用 cpio(1) 来创建 tar 文件。cpio 将文件存档到 stdin 上,因此如果您已经找到要用于选择存档文件的 find 命令,请将其导入 cpio 以创建 tar 文件:

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

解决方案 19:

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

  • –排除标签=文件

  • –排除标签全部=文件

  • --exclude-tag-under=文件

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

解决方案 20:

gnu tar v 1.26 --exclude 需要位于存档文件和备份目录参数之后,不应有前导或尾随斜杠,并且最好不使用引号(单引号或双引号)。因此,相对于要备份的父目录,它是:

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

解决方案 21:

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

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

解决方案 22:

成功案例: 1)如果给出完整路径来进行备份,则在排除时也应该使用完整路径。

tar -zcvf /opt/ABC/BKP_27032020/backup_27032020.tar.gz --exclude='/opt/ABC/csv/ ' --exclude='/opt/ABC/log/ ' /opt/ABC

2)如果使用当前路径进行备份,则在排除时也应该只使用当前路径。

tar -zcvf backup_27032020.tar.gz --exclude='ABC/csv/ ' --exclude='ABC/log/ ' ABC

失败案例:

  1. 如果提供当前路径目录进行备份并忽略完整路径,则不会起作用

tar -zcvf /opt/ABC/BKP_27032020/backup_27032020.tar.gz --exclude='/opt/ABC/csv/ ' --exclude='/opt/ABC/log/ ' ABC

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

解决方案 23:

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

解决方案 24:

一探究竟

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

解决方案 25:

我想在本地主机上拥有全新的前端版本(angular 文件夹)。另外,git 文件夹对我来说太大了,我想将其排除。我需要从服务器下载它,然后解压它才能运行应用程序。

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

命令 :

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

解决方案 26:

最好的办法是通过 xargs 将 find 与 tar 结合使用(以处理大量参数)。例如:

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

解决方案 27:

可能是多余的答案,但由于我发现它很有用,所以它在这里:

当我是 FreeBSD 根目录(即使用 csh)时,我想将整个根文件系统复制到 /mnt,但不复制 /usr 和(显然)/mnt。以下方法可行(我在 /):

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

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

我的0.02欧元

解决方案 28:

我无法让 tar 排除几层深的 5 GB 子目录。最后,我只好使用 unix Zip 命令。对我来说,它工作起来容易得多。

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

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

等效于:

zip -r /backup/文件名.zip . -x 上传/文件夹/\ 上传/文件夹2/\

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

解决方案 29:

我从来没有让tar --exclude选项对我有用。在我的例子中,使用rsync将文件夹树复制到新位置,然后使用标准tar方法。

rsync -av --exclude='node_modules' --exclude='.git' folder_tree folder_tree_excluded
tar -cvzf archive.tar.gz folder_tree_excluded

解决方案 30:

可能还可以使用 cat/xargs/echo 来模拟 rsync 的 --exclude-from=file 选项:

eval tar -cvzf tarball.tgz  $(cat exclude.lst | xargs -i echo -n "--exclude='{}' ") *

eval而 {} 两边的单引号用于特殊名称(例如包含空格)。如果您的文件夹名称中没有特殊字符,则可以跳过 eval 和单引号。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用