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

时间:2009-06-11 22:57:32

标签: linux shell archive tar

是否有一个简单的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 .

28 个答案:

答案 0 :(得分:891)

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

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

等会起作用。确定确定,在之前添加--exclude 源项目和目标项目。

答案 1 :(得分:124)

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

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

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

在你的情况下可能像

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

答案 2 :(得分:53)

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

答案 3 :(得分:41)

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

如果您有以下结构

/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的根目录(我在这里尝试了相对于/的完整路径但是我无法做到这一点)。

希望这会对某人有所帮助(下次我谷歌时会帮助我)

答案 4 :(得分:17)

您可以使用标准的“蚂蚁表示法”来排除相对目录 这对我有用,并且不包括任何.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的

答案 5 :(得分:16)

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

虽然这种结构对我有用:

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,

答案 6 :(得分:12)

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

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

答案 7 :(得分:10)

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

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

答案 8 :(得分:9)

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

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 *

答案 9 :(得分:7)

对于Mac OSX我必须做

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

请注意-f

后的--exclude=

答案 10 :(得分:6)

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

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

一个警告字样的副作用,我没有立即发现: 排除&#39; fileA&#39;在这个例子中将搜索&#39; fileA&#39;的递归!

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

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

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

答案 11 :(得分:6)

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

  1. 选项:-exclude-vcs

此选项不包括以下版本控制系统使用的文件和目录:CVSRCSSCCSSVNArch,{{1} },BazaarMercurial

从1.32版开始,不包括以下文件:

  • Darcs及其下的所有内容
  • CVS/及其下的所有内容
  • RCS/及其下的所有内容
  • SCCS/及其下的所有内容
  • .git/
  • .gitignore
  • .gitmodules
  • .gitattributes
  • .cvsignore及其下的所有内容
  • .svn/及其下的所有内容
  • .arch-ids/及其下的所有内容
  • {arch}/
  • =RELEASE-ID
  • =meta-update
  • =update
  • .bzr
  • .bzrignore
  • .bzrtags
  • .hg
  • .hgignore
  • .hgrags

    1. 选项:-排除-vcs-ignores

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

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

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

.hgignore

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

.cvsignore

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

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

#

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

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

#

包含posix正则表达式(17)。行.hgignore切换到Shell浮动模式。行syntax: glob切换回去。注释以syntax: regexp开头。模式会影响目录及其所有子目录。

  1. 示例

#

答案 12 :(得分:5)

为避免因处理成千上万个文件时'xargs: Argument list too long'使用find ... | xargs ...而导致的find错误,您可以使用{tarfind ... -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 - {1}}。

{{1}}

答案 13 :(得分:5)

在阅读完这个帖子之后,我在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/*'

答案 14 :(得分:4)

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

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

答案 15 :(得分:3)

您还可以使用其中一个&#34; - exclude-tag&#34;选项取决于您的需求:

  • - 排除标签= FILE
  • - 排除标签的所有= FILE
  • - 排除标签的下= FILE

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

答案 16 :(得分:2)

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

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

答案 17 :(得分:2)

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

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

答案 18 :(得分:1)

成功案例: 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. 如果给currentpath目录进行备份并忽略完整路径,则无法正常工作

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

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

答案 19 :(得分:1)

在阅读了所有不同版本的所有好的答案并为自己解决了问题之后,我认为有非常小的细节,对于GNU / Linux通用来说是非常重要的,而很少见的没有足够的压力,应该得到更多的评论。

因此,我不会尝试针对每种情况回答该问题,而是尝试在无法解决问题的地方寻找位置

非常重要的通知:

  1. 选项事项的顺序:将--exclude放在文件选项和要备份的目录之前与之后是不同的。至少对我来说这是意外的,因为根据我的经验,在GNU / Linux命令中,选项的顺序通常无关紧要。
  2. 不同的tar版本希望此选项以不同的顺序排列:例如,@Andrew's answer表示在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/

引号无关紧要,无论是否使用引号都可以。

我希望这对某人有用。

答案 20 :(得分:1)

我想展示我用来获得与提供答案之前相同的结果的另一个选项,我有一个类似的案例,我想使用tar文件将所有Android Studio项目一起备份到tar文件中,然后使用使用 du 命令查找大文件,我发现我不需要一些目录,例如: 生成,Linux e .dart_tools 使用Charles_ma的第一个答案,我对其进行了一些修改,以便能够从我的Android目录的父目录中运行命令。

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

它就像一种魅力。

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

答案 21 :(得分:1)

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

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

答案 22 :(得分:1)

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

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

答案 23 :(得分:0)

检查出来

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

答案 24 :(得分:0)

我想在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/

答案 25 :(得分: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

答案 26 :(得分:0)

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

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

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

我的全部观点是,必须(通过将 ./ 指定到tar,以便将被删除的目录复制到更大目录的一部分。< / p>

我的€0.02

答案 27 :(得分:-1)

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

for index, innerdict in enumerate(yourdata['hotelesDisponibles']):
    print("Index:", index, "Habitacion:", "Yes" if 'habitacion' in innerdict else "No")

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

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

修改

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

的转义字符