我在bash脚本中有这条非常简单的行,该脚本可以成功执行(即生成_data.tar
文件),除了它不排除通过--exclude
选项告知其被排除的子目录外:
/bin/tar -cf /home/_data.tar --exclude='/data/sub1/*' --exclude='/data/sub2/*' --exclude='/data/sub3/*' --exclude='/data/sub4/*' --exclude='/data/sub5/*' /data
相反,它将生成一个_data.tar
文件,其中包含/ data下的所有内容,包括我要排除的子目录中的文件。
知道为什么吗?以及如何解决这个问题?
更新我根据下面第一个答案中提供的链接实现了我的观察(首先是顶层目录,最后一个排除后没有空格):
/bin/tar -cf /home/_data.tar /data --exclude='/data/sub1/*' --exclude='/data/sub2/*' --exclude='/data/sub3/*' --exclude='/data/sub4/*' --exclude='/data/sub5/*'
但这没有帮助。所有“排除的”子目录都存在于结果_data.tar
文件中。
这令人困惑。无论这是当前tar中的错误(CentOS 6.2,Linux 2.6.32上的GNU tar 1.23)还是tar对空白和其他易于忽略的错别字的“极端敏感性”,我都认为这是一个错误。目前。
这太可怕了:我尝试了以下建议的见解(无尾随/*
),但在生产脚本中仍然无效:
/bin/tar -cf /home/_data.tar /data --exclude='/data/sub1' --exclude='/data/sub2' --exclude='/data/sub3' --exclude='/data/sub4'
除了引号和2个空格(而不是1),我看不到尝试和@Richard Perrin尝试的内容之间的任何区别。我将尝试这种方式(必须等待每晚运行的脚本作为要备份的目录)数量庞大)并进行报告。
/bin/tar -cf /home/_data.tar /data --exclude=/data/sub1 --exclude=/data/sub2 --exclude=/data/sub3 --exclude=/data/sub4
我开始认为所有这些tar --exclude
敏感性不是焦油的而是环境中的某种东西,但是那又会是什么呢?
有效!最后一个变体尝试了工作(在--exclude
s 之间没有单引号和单空格,而不是双空格)。很奇怪,但是接受。
难以置信的!事实证明,tar
仅当顶级目录位于命令行的最后时,才会排除(1.15.1)的较旧版本。这与1.23版的要求完全相反。仅供参考。