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 之前的源和目标项目.
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)
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)
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的根目录(我在这里尝试了相对于/的完整路径,但我无法做到这一点).
希望这会帮助某人(我下次谷歌时也会这样)
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
小智 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,
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)
小智 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)
在阅读了不同版本的所有这些好答案并为我自己解决了问题之后,我认为有一些非常重要的小细节,对于 GNU/Linux 的一般使用来说是很少见的,没有足够的压力,值得更多的评论。
因此,我不会尝试针对每种情况都回答这个问题,而是尝试注册在出现问题时要查看的位置。
请务必注意:
就我而言,对于 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)
引号无关紧要,无论有没有它们都可以使用。
我希望这对某人有用。
如果您尝试排除版本控制系统 (VCS) 文件,tar 已经支持两个有趣的选项!:)
这个选项排除按照版本控制系统中的文件和目录:CVS,RCS,SCCS,SVN,Arch,Bazaar,Mercurial,和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
当归档是在一些版本控制系统(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切换回来。注释以#.开头。模式影响目录及其所有子目录。
tar -czv --exclude-vcs --exclude-vcs-ignores -f path/to/my-tar-file.tar.gz path/to/my/project/
对于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)
| 归档时间: |
|
| 查看次数: |
824591 次 |
| 最近记录: |