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

dee*_*ell 760 linux shell tar archive

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

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

不完全解决方案:

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

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

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

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

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

cd /folder_to_backup
tar --exclude='./folder' --exclude='./upload/folder2' -zcvf /backup/filename.tgz .
Run Code Online (Sandbox Code Playgroud)

Cha*_* Ma 970

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

$ tar --exclude='./folder' --exclude='./upload/folder2' -zcvf /backup/filename.tgz .
Run Code Online (Sandbox Code Playgroud)

等会工作.请务必--exclude 之前的源和目标项目.

  • 这个答案让它看起来像--exclude排在第一位...... tar cvfpz ../stuff.tgz --exclude ='node_modules'--exclude ='.git'. (72认同)
  • 排除目录末尾的"/"将导致失败.我猜tar认为结尾/是要排除的目录名称的一部分.坏: - exclude = mydir/GOOD: - exclude = mydir (19认同)
  • 举个例子,如果你想备份你的WordPress项目文件夹,不包括上传文件夹,你可以使用这个命令:**焦油-cvf wordpress_backup.tar WordPress的--exclude =的wp-content /上传** (12认同)
  • 我想出了以下命令:`tar -zcv --exclude ='file1'--exclude ='patter*' - exclude ='file2'-f /backup/filename.tgz .`注意`-f `标志需要在tar文件之前看到:http://superuser.com/a/559341/415047 (11认同)
  • >确保在源和目标项之前放置--exclude.或者使用绝对路径进行排除:tar -cvpzf backups/target.tar.gz --exclude ='/ home/username/backups'/ home/username (3认同)
  • 排除标签的排序很重要.但是这种行为怎么不算错呢?将是一个简单的解决方案. (2认同)
  • 请注意,要排除的目录的路径不应以斜杠结尾。`--exclude='./folder'` 有效,但 --exclude='./folder/' 不起作用。 (2认同)

Joh*_*erg 129

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

如果要存档除了/usr可以使用的所有内容:

tar -zcvf /all.tgz / --exclude=/usr
Run Code Online (Sandbox Code Playgroud)

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

tar -zcvf archive.tgz arc_dir --exclude=dir/ignore_this_dir
Run Code Online (Sandbox Code Playgroud)

  • 为了澄清,您可以使用--exclude的完整路径. (17认同)
  • 在某些情况下,需要在要存档的文件/文件夹之前添加 --exclude (5认同)

Ste*_*ker 60

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

使用多种模式排除文件

tar -czf backup.tar.gz --exclude=PATTERN1 --exclude=PATTERN2 ... /path/to/backup
Run Code Online (Sandbox Code Playgroud)

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

tar -czf backup.tar.gz -X /path/to/exclude.txt /path/to/backup
Run Code Online (Sandbox Code Playgroud)

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

tar -czf backup.tar.gz --exclude-tag-all=exclude.tag /path/to/backup
Run Code Online (Sandbox Code Playgroud)

  • 参数的顺序似乎很重要,这种形式对我有用。 (4认同)

Sve*_*rre 43

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

如果你有以下结构

/home/ftp/mysite/
Run Code Online (Sandbox Code Playgroud)

使用以下文件/文件夹

/home/ftp/mysite/file1
/home/ftp/mysite/file2
/home/ftp/mysite/file3
/home/ftp/mysite/folder1
/home/ftp/mysite/folder2
/home/ftp/mysite/folder3
Run Code Online (Sandbox Code Playgroud)

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

我们使用的格式

tar -czvf <name of tar file> <what to tar> <any excludes>
Run Code Online (Sandbox Code Playgroud)

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

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

cd /home/ftp/
tar -czvf mysite.tar.gz mysite --exclude='file3' --exclude='folder3'
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这个答案肯定对我有帮助!对我来说,问题是我的命令看起来像`tar -czvf mysite.tar.gz mysite --exclude ='./ mysite/file3'-exclude ='./ mysite/folder3'`,这不是排除任何东西 (5认同)
  • 您的样本与我遇到的问题非常相似!谢谢! (2认同)
  • 很好,很清楚,谢谢。对我来说,问题是其他答案包括相对路径的绝对值。但是,您要做的就是添加要排除的文件夹的名称。 (2认同)
  • 这是一个更加明确的答案。由于这个例子,我能够使它正常工作,因为起初路径令人困惑。谢谢一群! (2认同)
  • 有效!请记住不要在排除项后面加上斜杠。例如,当“ file3”或“ file3 / subfolder”起作用时,“ file3 /”和“ file3 / subfolder /”却不起作用! (2认同)

Eri*_*ley 19

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

tar -cvf myFile.tar --exclude=**/.git/* --exclude=**/node_modules/*  -T /data/txt/myInputFile.txt 2> /data/txt/myTarLogFile.txt
Run Code Online (Sandbox Code Playgroud)

myInputFile.txt包含:

/ dev2/java
/ dev2/javascript

  • 我认为这需要启用Bash shell选项变量`globstar`.查看`shopt -s globstar`.在大多数基于unix的操作系统上,我认为它默认为**.从Bash手册:"**globstar:***如果设置,文件名扩展上下文中使用的模式`**`将匹配所有文件和零个或多个目录和子目录.如果模式后跟一个'/',只有目录和子目录匹配.*" (4认同)
  • 这在 MacOS 上对我不起作用,但 `--exclude=.git --exclude=node_modules` 有效。我还必须将 `--exlcude` 参数设置为 `tar` 之后的第一个参数(即在 `-c` 之前)。我认为这是因为我正在使用的其他一些选项,但我想我会将其留在这里别人的利益 (2认同)

小智 19

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

tar --exclude='*/build' --exclude='*/linux' --exclude='*/.dart_tool' -zcvf androidProjects.tar Android/
Run Code Online (Sandbox Code Playgroud)

它就像一个魅力。

诗。抱歉,如果不允许这种答案,如果是这种情况,我将删除。


Gee*_*tVc 16

我经历过这一点,至少我使用的是Cygwin版本的tar(在Windows XP Home Edition上使用"CYGWIN_NT-5.1 1.7.17(0.262/5/3)2012-10-19 14:39 i686 Cygwin") SP3机器),选项的顺序很重要.

虽然这种结构对我有用:

tar cfvz target.tgz --exclude='<dir1>' --exclude='<dir2>' target_dir
Run Code Online (Sandbox Code Playgroud)

一个没有工作:

tar cfvz --exclude='<dir1>' --exclude='<dir2>' target.tgz target_dir
Run Code Online (Sandbox Code Playgroud)

这,同时tar --help揭示了以下内容:

tar [OPTION...] [FILE]
Run Code Online (Sandbox Code Playgroud)

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

最好的rgds,

  • 这是因为目标归档target.tgz是f开关的一个参数,它应该遵循 (16认同)
  • 只是想添加上面的内容,要排除的目录不应包含最终的反斜杠.所以,** - exclude ='/ path/to/exclude/dir'**是_CORRECT_,** - exclude ='/ path/to/exclude/dir /'**是_WRONG_. (5认同)

Sco*_*and 13

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

tar --exclude={*.png,*.mp3,*.wav,.git,node_modules} -Jcf ${target_tarball}  ${source_dirname}
Run Code Online (Sandbox Code Playgroud)


Rob*_*Rob 10

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

tar zc --exclude __MACOSX --exclude .DS_Store -f <archive> <source(s)>
Run Code Online (Sandbox Code Playgroud)

  • 感谢这个答案,darwin上的tar绝对有不同的语法,这让我很难以解释为什么"--exclude = blah"在其他答案中无效.这在mac上运行得很好. (2认同)

小智 10

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

Tar --version
Run Code Online (Sandbox Code Playgroud)

tar(GNU tar)1.27.1

有效的命令语法:

tar -czvf ../allfiles-butsome.tar.gz * --exclude=acme/foo
Run Code Online (Sandbox Code Playgroud)

这些不起作用:

$ 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 *
Run Code Online (Sandbox Code Playgroud)


use*_*863 8

在阅读了不同版本的所有这些好答案并为我自己解决了问题之后,我认为有一些非常重要的小细节,对于 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 伸展上的 GNU tar 1.29,有效的命令是

tar --exclude="/home/user/.config/chromium" --exclude="/home/user/.cache" -cf file.tar  /dir1/ /home/ /dir3/
Run Code Online (Sandbox Code Playgroud)

引号无关紧要,无论有没有它们都可以使用。

我希望这对某人有用。

  • 谢谢您的回答。我一直在寻找(感觉很长一段时间)的解决方案,你的答案引导我走向正确的方向。但是,就我而言(Ubuntu 18.04.3,Tar 1.29),我只能通过添加文件夹名称而不是路径来使其工作,例如:tar --exclude=folder1 --exclude=folder2 -czvf /opt/archieve。 tgz文件夹 (2认同)

T.M*_*.M. 8

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

  1. 选项:-- exclude-vcs

这个选项排除按照版本控制系统中的文件和目录:CVSRCSSCCSSVNArchBazaarMercurial,和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

    1. 选项:-- exclude-vcs-ignores

当归档是在一些版本控制系统(VCS)目录,这是很方便的从这个VCS”读排除模式忽略文件(例如.cvsignore.gitignore等),这个选项提供了这样的可能性。

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

模式的处理方式与相应的 VCS 处理方式相同,即:

.cvsignore

包含仅适用于此文件所在目录的 shell 样式的通配模式。文件中不允许有任何评论。空行被忽略。

.gitignore

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

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

.bzrignore

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

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

.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/


Jer*_*naw 7

对于Mac OSX,我必须这样做

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

注意-f之后--exclude=


小智 6

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

$ tar --exclude='./folder_or_file' --exclude='file_pattern' --exclude='fileA'
Run Code Online (Sandbox Code Playgroud)

关于副作用的警告,我没有立即发现:在此示例中排除'fileA'将会重新搜索'fileA' !

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

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

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


小智 5

为避免在处理成千上万个文件时'xargs: Argument list too long'由于使用造成的可能错误find ... | xargs ...,您可以将的输出find直接tar通过管道传递给using find ... -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 \
   -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 -
Run Code Online (Sandbox Code Playgroud)


小智 5

阅读此线程后,我在RHEL 5上做了一些测试,这是我为abc目录加油的结果:

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

tar cvpzf abc.tgz abc/ --exclude='abc/error' --exclude='abc/logs'
Run Code Online (Sandbox Code Playgroud)

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

tar cvpzf abc.tgz abc/ --exclude='abc/error/*' --exclude='abc/logs/*'
Run Code Online (Sandbox Code Playgroud)