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

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

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

我有一个目录,需要使用子目录进行存档,该子目录包含许多我不需要备份的非常大的文件。

不完全解决方案:

--exclude='./folder'命令匹配给定的模式并排除这些文件,但我需要特定的文件& 要忽略的文件夹(完整文件路径),否则可能会排除有效文件。

我还可以使用find命令创建文件列表并排除我不想存档的文件并将列表传递给tar,但这仅适用于少量文件。 我有成千上万。

我开始认为唯一的解决方案是创建一个包含要排除的文件/文件夹列表的文件,然后使用rsync和--exclude='./folder'将所有文件复制到tmp目录,然后使用tar来存档该目录。

任何人都可以想到更好/更有效的解决方案吗?

编辑:cma的解决方案运作良好。 最重要的是--exclude='./folder'必须在tar命令的开头。 完整命令(cd首先,所以备份是相对于该目录):

cd /folder_to_backup

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

23个解决方案

786 votes

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

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

等会起作用。 确保在源项目和目标项目之前放置--exclude。

Charles Ma answered 2018-12-23T10:14:58Z

117 votes

您可以使用/usr排除tar目录。

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

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

在你的情况下也许是这样的

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

Johan Soderberg answered 2018-12-23T10:15:27Z

51 votes

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

Stephen Donecker answered 2018-12-23T10:16:00Z

36 votes

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

如果你有以下结构

/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

其中c = create,z = zip和v = verbose(您可以在输入文件时看到这些文件,确保您添加的文件都没有被添加)。 和f =文件。

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

cd /home/ftp/

tar -czvf mysite.tar.gz mysite --exclude='file3' --exclude='folder3'

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

希望这会有所帮助(我下次谷歌时也会这样)

Sverre answered 2018-12-23T10:16:56Z

15 votes

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

虽然这种结构对我有用:

tar cfvz target.tgz --exclude='' --exclude='' target_dir

一个不起作用:

tar cfvz --exclude='' --exclude='' target.tgz target_dir

这,而tar --help揭示了以下内容:

tar [OPTION...] [FILE]

所以,第二个命令也应该有效,但显然似乎并非如此......

最好的rgds,

GeertVc answered 2018-12-23T10:17:38Z

14 votes

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

Eric Manley answered 2018-12-23T10:18:15Z

12 votes

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

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

Scott Stensland answered 2018-12-23T10:18:35Z

10 votes

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

tar zc --exclude __MACOSX --exclude .DS_Store -f

Rob answered 2018-12-23T10:18:55Z

5 votes

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

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

关于副作用的警告,我没有立即发现:在此示例中排除'fileA'将重新搜索'fileA'!

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

data.txt

config.txt

--+dirA

| data.txt

| config.docx

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

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

Aaron Votre answered 2018-12-23T10:19:34Z

5 votes

对于Mac OSX,我必须这样做

-f

请注意-f之后的-f

Jerinaw answered 2018-12-23T10:20:02Z

5 votes

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

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 *

J. Lawson answered 2018-12-23T10:20:35Z

4 votes

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

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

Alex B answered 2018-12-23T10:20:56Z

4 votes

为了避免因处理成千上万个文件时使用find ... | xargs ...而导致'xargs: Argument list too long'错误,您可以使用find ... -print0 | tar --null ...将find的输出直接传输到tar。

# 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 -

carlo answered 2018-12-23T10:21:16Z

4 votes

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

Mike answered 2018-12-23T10:21:45Z

2 votes

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

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

camh answered 2018-12-23T10:22:06Z

2 votes

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

--exclude标签= FILE

- 排除标记 - 所有= FILE

--exclude标签的下= FILE

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

frommelmak answered 2018-12-23T10:22:43Z

2 votes

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

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

Andrew answered 2018-12-23T10:23:08Z

1 votes

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

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

Joe answered 2018-12-23T10:23:28Z

1 votes

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

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

Ashwini Gupta answered 2018-12-23T10:23:48Z

0 votes

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

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

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

我的全部观点是,有必要(通过./)来指定tar被删除的目录,其中复制的更大目录的一部分。

我的€0.02

Georgios answered 2018-12-23T10:24:22Z

0 votes

我没有运气得到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)]

user2792605 answered 2018-12-23T10:25:04Z

0 votes

看看这个

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

RohitPorwal answered 2018-12-23T10:25:24Z

-1 votes

以下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,这仍然有用。

编辑

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

James answered 2018-12-23T10:26:03Z

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值