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

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

我有一个目录,需要存档一个子目录,有很多非常大的文件,我不需要备份。

不完全解决scheme:

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

我也可以使用find命令来创build一个文件列表,并排除那些我不想存档的文件,并将这个列表传递给tar,但是这只适用于less量的文件。 我有成千上万。

我开始认为唯一的解决办法是创build一个文件列表的文件/文件夹被排除在外,然后使用rsync和--exclude-from=file将所有文件复制到一个tmp目录,然后使用tar归档该目录。

任何人都可以想到一个更好/更有效的解决scheme吗?

编辑: cma的解决scheme运作良好。 最大的问题是--exclude='./folder' 必须位于tar命令的开头。 完整的命令(CD先,所以备份是相对于该目录):

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

你可以有多个tar排除选项

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

等将工作。 确保在源项目和目标项目之前放置 – --exclude

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

如果你想存档除/usr之外的所有东西,你可以使用:

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

在你的情况下,可能类似

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

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

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

如果你有以下结构

 /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 =详细信息(可以在input文件时看到这些文件,有用的是确保没有任何文件被添加)。 和f =文件。

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

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

注意排除文件/文件夹是相对于你的焦油的根(我已经尝试完整的path在这里相对于/但我不能做这个工作)。

希望这会帮助别人(和我下一次我谷歌)

我已经经历过,至less在我使用的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机器),选项顺序很重要。

虽然这个build筑为我工作:

 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,

我发现这个地方,所以我不会拿信誉,但它比上述任何解决scheme对我的Mac特定问题(即使这是封闭的)更好:

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

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

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

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

使用find命令和tar append(-r)选项。 通过这种方式,您可以在一个步骤中将文件添加到现有的tar中,而不是一个两遍的解决scheme(创build文件列表,创buildtar)。

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

为了避免由于使用find ... | xargs ...引起的可能的'xargs: Argument list too long'错误 find ... | xargs ...当处理数以万计的文件时,可以使用find ... -print0 | tar --null ...直接将find ... -print0 | tar --null ...的输出传递给tar 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 - 

读完这个线程之后,我在RHEL 5上做了一些testing,下面是我的abc目录的结果:

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

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

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

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

您可以使用cpio(1)创buildtar文件。 cpio把这些文件归档到stdin上,所以如果你已经想出了你想用来select归档文件的find命令,可以将它传递给cpio来创buildtar文件:

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

您也可以根据您的需要使用“–exclude-tag”选项之一:

  • –exclude标签= FILE
  • – 排除标记 – 所有= FILE
  • –exclude标签的下= FILE

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

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

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

一个警告的一个副作用,我没有立即发现显而易见的警告 :在这个例子中'fileA'的排除将search'fileA'RECURSIVELY

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

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

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

对于Mac OSX我不得不这样做

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

注意--exclude=之后的-f

你最好的select是通过xargs使用tar来处理大量的参数。 例如:

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

可能的多余的答案,但因为我觉得它有用,在这里它是:

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

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

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

我的€0.02

我没有运气得到tar来排除几个级别的5千兆字节的子目录。 最后,我只使用了unix Zip命令。 这对我来说工作起来容易很多。

所以对于这个来自原始post的特定例子
(tar –exclude ='。/ folder'–exclude ='。/ upload / folder2'-zcvf /backup/filename.tgz。)

相当于:

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

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

gnu tar v 1.26 –exclude需要在归档文件和备份目录参数之后出现,不应该有前导斜线或尾部斜线,并且不要使用引号(单或双)。 所以相对于要备份的PARENT目录,它是:

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

一探究竟

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

这将打印出你需要的命令,你可以将其复制并粘贴回去。可能有更好的方法直接将它提供给命令行。

只要改变* .CC为任何其他常见的扩展名,文件名或正则expression式要排除,这应该仍然工作。

编辑

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