Os símbolos% precisam ser escapados em tarefas agendadas.
Coloque uma barra invertida na frente de cada uma delas.
Edição tardia:
Não tenho certeza de como perdi isso antes, mas você está usando uma sintaxe bash para criar um subshell para executar o comando date
. Como o cron não é bash, isso não funcionará. Ele funcionará se você alterar seu cron job para isso:
0 20 * * * /data/code/scripts/foo.sh >/root/foo.'date +\%Y-\%m-\%d-\%T'.log 2>&1
Como alternativa, você pode fazer o redirecionamento de saída de dentro do script ou (se não for apropriado) escrever um script de invólucro que chame o acima e faça o redirecionamento de saída.