19 15 * * * root /opt/scripts/clean-nexus-release-repo.sh
clean-nexus-release-repo.sh脚本如下所示:
#!/bin/bash find /opt/sonatype-work/nexus/storage/releases/se/company* -regextype posix-extended -depth -regex '.*/r?[0-9]{5,7}[a-Z0-9_.-]*\.[0-9]{1,3}' -mtime +60 -type d -print -exec rm -r {} \; find /opt/sonatype-work/nexus/storage/releases/nu/company -regextype posix-extended -depth -regex '.*/r?[0-9]{5,7}[a-Z0-9_.-]*\.[0-9]{1,3}' -mtime +60 -type d -print -exec rm -r {} \;
当我从我的shell运行clean-nexus-release-repo.sh脚本时,一切正常。 当它运行通过cron我得到以下输出:
find: Invalid range end find: Invalid range end
这是我在将[a-Z0-9_.-]正则expression式中的连字符移动到无效位置时得到的错误。 我已经尝试了以下,但我仍然得到同样的错误:
find --version给出:
find (GNU findutils) 4.4.2
在Linux上运行devtools01 2.6.32-71.el6.x86_64(CentOS Linux版本6.0)
我不确定我可以在这里给出完美的技术解释。 也许别人可以改善答案。
基本上我记得范围expression式是区域依赖的,所以[aZ]不一定意味着与[a-zA-Z]
我认为相关文件是:
http://www.gnu.org/software/grep/manual/grep.html#index-range-expression-216 :
在括号expression式中,范围expression式由两个由连字符分隔的字符组成。 它匹配使用语言环境的整理序列和字符集在两个字符(包括两个字符)之间进行sorting的任何单个字符。 例如,在默认的C语言环境中,“[ad]”等同于“[abcd]”。 许多语言环境按字典顺序对字符进行sorting,在这些语言环境中,[ad]通常不等同于[abcd]; 例如,它可能等同于“[aBbCcDd]”。 要获得对括号expression式的传统解释,可以通过将LC_ALL环境variables设置为值“C”来使用“C”语言环境。
[aZ]按照预期的方式使用区域设置fr_FR.UTF-8,并且可能与所有UTF8语言环境一样,但是不与“C”区域设置一致,如以前所回答的。
从cron运行的脚本不inheritance区域设置,而从命令行testing的同一脚本inheritance用户区域设置(xx_XX.UTF-8)。 这解释了不同的行为。
好吧,我认为这个问题是在定义范围的方法中find的。 aZ表示从“a”(97)的ascii值到ascii值“Z”(90),意味着范围在它开始之前结束。
为什么它在shell中工作,我不确定,但改变了正则expression式
-regex '.*/r?[0-9]{5,7}[a-Z0-9_.-]*\.[0-9]{1,3}'
至
-regex '.*/r?[0-9]{5,7}[a-zA-Z0-9_.-]*\.[0-9]{1,3}'
为我工作。