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命令。 这打印 – 从列表中排除“一个条目”。 斜杠()是“标记”的转义字符。