linux - tar目录结构 - Shell命令将tar目录排除在某些文件/文件夹之外




tar排除隐藏文件 (16)

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

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

为了避免由于使用find ... | xargs ...引起的'xargs: Argument list too long'错误 find ... | xargs ...在处理数以万计的文件时,可以使用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 -

你可以有多个tar排除选项

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

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


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

可能的冗余答案,但因为我发现它很有用,它是这样的:

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

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

我的观点是,有必要(通过放置./指定将tar目录中正在复制的更大目录的一部分排除在外的目录。

我的€0.02


对于Mac OSX我必须这样做

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

注意--exclude=之后的-f


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

Tar --version

焦油(GNU焦油)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 *

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

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

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


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

如果你想存档除/usr以外的所有内容,你可以使用:

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

在你的情况下,可能类似

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

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


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

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

我没有运气获得tar来排除几个级别的5 GB子目录。 最后,我只使用了unix Zip命令。 它对我来说工作起来更容易。

因此,来自原始帖子的这个特定例子
(tar --exclude ='。/文件夹'--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


我经历过,至少在我使用的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,


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

如果你有以下结构

/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

所以,你想制作一个tar文件,其中包含/ home / ftp / mysite中的所有内容(将站点移动到新的服务器上),但file3只是垃圾文件, folder3所有内容也都不需要,因此我们将跳过这些二。

我们使用格式

tar -czvf <name of tar file> <what to tar> <any excludes>

其中c = create,z = zip和v =详细信息(您可以在输入文件时看到这些文件,有用的确保没有任何您排除的文件被添加)。 和f =文件。

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

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

请注意排除的文件/文件夹相对于tar的根目录(我已经尝试了完整路径,相对于/但我无法完成这项工作)。

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


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

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





tar