排除特定文件/文件夹的Shell命令来压缩目录

1094
有没有一种简单的shell命令/脚本可以排除某些文件/文件夹不被归档? 我有一个需要归档的目录,其中包含一个具有大量我不需要备份的非常大的文件的子目录。 用tar --exclude=PATTERN命令匹配给定的模式并排除那些文件,但我需要忽略特定的文件和文件夹(完整的文件路径),否则可能会排除有效的文件。我也可以使用find命令创建要排除的文件列表,并排除我不想存档的文件并将列表传递给tar,但这仅适用于少量文件。我有成千上万个文件。我开始认为唯一的解决方案是创建一个带有要排除的文件/文件夹列表的文件,然后使用rsync和--exclude-from = file将所有文件复制到tmp目录,然后再使用tar将该目录归档。有人能想到更好/更高效的解决方案吗? 编辑:Charles Ma的解决方案很好。 最大的问题在于--exclude='./folder'必须位于tar命令的开头。 完整命令(先CD,因此备份相对于该目录):
cd /folder_to_backup
tar --exclude='./folder' --exclude='./upload/folder2' -zcvf /backup/filename.tgz .

173
另外一件事让我困惑,或许值得注意的是:在被排除的文件夹路径后加上斜杠会导致tar根本无法排除这些文件夹。 - Rekhyt
7
@Rekhyt 感谢,我盯着这个命令看了15分钟...然后30分钟。 - earcam
12
看起来,--exclude 的位置取决于 tar 的版本。对于 tar 1.23 版本,--exclude 需要放在主命令之后。 - Joel G Mathew
3
别忘了使用“”(引号)。 - Meetai.com
7
“--exclude”不一定要放在第一个,但必须在源目录之前的某个位置(在Cygwin上测试过tar 1.29)。 - wortwart
显示剩余6条评论
31个回答

-1

下面的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命令。这将打印--exclude '列表中的一个条目'。斜杠(\)是引号的转义字符。


1
大多数 shell 脚本都不应该要求交互式输入,改为读取命令行参数,你就可以享受到 shell 的标签补全、历史记录补全、历史记录编辑等好处。 - tripleee
1
此外,您的脚本无法处理包含空格或shell元字符的路径。除非您明确要求shell执行空格标记化和通配符扩展,否则应基本上总是将变量放在双引号中。有关详细信息,请参见https://dev59.com/NWkw5IYBdhLWcg3wMHum。 - tripleee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接