使用正则expression式运行包含查找的脚本在cron中失败,但在shell中工作

我在/etc/cron.d中有以下脚本

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命令的绝对path
  • 用反斜杠转义连字符
  • 删除该连字符

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}' 

为我工作。