A execução de um script que contém o find com um regexp falha no cron, mas funciona em um shell

2

Eu tenho o seguinte script no meu /etc/cron.d:

19 15 * * * root /opt/scripts/clean-nexus-release-repo.sh

O script clean-nexus-release-repo.sh é assim:

#!/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 {} \;

Quando eu executo o script clean-nexus-release-repo.sh do meu shell, tudo funciona bem. Quando é executado através do cron, recebo a seguinte saída:

find: Invalid range end
find: Invalid range end

Este é o mesmo erro que recebo quando movo o hífen na expressão [a-Z0-9_.-] regular para uma posição inválida. Eu tentei o seguinte, mas ainda recebo o mesmo erro:

  • Especificando um caminho absoluto para o comando find
  • Escapando o hífen com uma barra invertida
  • Remover esse hífen

find --version dá:

find (GNU findutils) 4.4.2

Executando no Linux devtools01 2.6.32-71.el6.x86_64 (versão 6.0 do CentOS Linux)

    
por K Erlandsson 08.01.2013 / 15:42

3 respostas

2

Não tenho certeza se posso dar a explicação técnica perfeita aqui. talvez alguém possa melhorar a resposta.

Basicamente, lembro que expressões de intervalo são dependentes de localidade, então [a-Z] não significa necessariamente a mesma coisa que [a-zA-Z]

Acho que a documentação relevante é:

link :

Within a bracket expression, a range expression consists of two characters separated by a hyphen. It matches any single character that sorts between the two characters, inclusive, using the locale's collating sequence and character set. For example, in the default C locale, ‘[a-d]’ is equivalent to ‘[abcd]’. Many locales sort characters in dictionary order, and in these locales ‘[a-d]’ is typically not equivalent to ‘[abcd]’; it might be equivalent to ‘[aBbCcDd]’, for example. To obtain the traditional interpretation of bracket expressions, you can use the ‘C’ locale by setting the LC_ALL environment variable to the value ‘C’.

    
por 08.01.2013 / 16:37
2

[a-Z] funciona como planejado com o código de idioma fr_FR.UTF-8 e, provavelmente, com todos os códigos do idioma UTF8, mas não com o código do idioma "C", conforme respondido anteriormente.

Uma execução de script do cron não herda nenhuma localidade, enquanto o mesmo script testado a partir da linha de comando herda a localidade do usuário (xx_XX.UTF-8). Isso explica o comportamento diferente.

    
por 07.05.2015 / 15:19
1

Ok, acho que o problema é encontrado com a maneira como os intervalos são definidos. a-Z significa do valor ascii de "a" (97) ao valor ascii "Z" (90) significando que o intervalo termina antes de iniciar.

Por que funciona no shell, não tenho certeza, mas altero o regex de

-regex '.*/r?[0-9]{5,7}[a-Z0-9_.-]*\.[0-9]{1,3}'

para

-regex '.*/r?[0-9]{5,7}[a-zA-Z0-9_.-]*\.[0-9]{1,3}'

funciona para mim.

    
por 08.01.2013 / 16:37