Essa é uma revisão anterior do documento!
Tabela de conteúdos
Expressões Regulares
Uma ótima referência on-line sobre o assunto: http://guia-er.sf.net
Expressão regular para colocar ponto de milhar em números até trilhões
$ (echo 1234567890123; echo 1234) | sed -e 's/\([0-9]\{1,3\}\)\([0-9]\{3\}\)$/\1.\2/' \ -e 's/\([0-9]\{1,3\}\)\([0-9]\{3\}\.[0-9]\{3\}\)$/\1.\2/' \ -e 's/\([0-9]\{1,3\}\)\([0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}\)$/\1.\2/' \ -e 's/\([0-9]\{1,3\}\)\([0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}\)$/\1.\2/' 1.234.567.890.123 1.234
Notem que essa é a sintaxe para uso com o sed. Em várias outras ferramentas, como perl por exemplo, a sintaxe muda um pouco. No perl não seria necessário usar a barra de escape nos parêntesis e chaves. Notem ainda que não se trata de apenas uma expressão, é a aplicação seqüencial de 4 expressões regulares que dá o resultado esperado. Talvez dê para reduzir isso, mas não parei pra pensar por falta de tempo e por que essa já resolveu meu problema.
Scripts
Upload de arquivos
Este é na verdade um conjunto de scripts combinando shell e php para upload de arquivos em grande número e possivelmente grandes. A necessidade surgiu para enviar arquivos a partir de uma rede fechada por firewall, que não permitia upload de arquivos via FTP. Para usar HTTP temos dois problemas, o upload é via formulário e não suporta grandes volumes de dados em geral.
A solução final tem 2 scripts na origem, que podem receber uma lista grande de arquivos grandes para upload. O script principal verifica o tamanho do arquivo, parte se necessário, envia cada parte ou cada arquivo, providencia a junção das partes no destino e registra o sucesso ou fracasso de cada upload, verificando isso via checksum com hash md5. Se o arquivo final foi corretamente enviado ou juntado (no caso de ter sido partido) o arquivo é renomeado com um prefixo “foi-”.
Inicialmente é necessário configurar o script principal da origem para indicar a url de upload, parâmetros do proxy, localização de comandos e limite de tamanho a partir do qual deve se partir os arquivos. Um pré-requisito básico, algumas vezes não encontrado no sistema de origem, é o comando wget.
Tanto o sistema origem como destino precisa ser unix-like, embora o php no destino possa ser refeito para evitar essa necessidade no destino. Na origem é um pouco mais complicado fugir do shell, mesmo por que, no meu caso pelo menos, o wget foi a única ferramenta que conseguiu passar com sucesso pelo proxy. Cheguei a tentar http_post_data do pacote pecl do php, sem sucesso.
Scripts na origem
post.sh - script principal. Deve ser configurado inicialmente. É quem deve ser executado, passando na própria linha de comando os arquivos que devem ser enviados ao destino.
post.php - script auxiliar que codifica o arquivo original em base64 para envio. É necessário interpretador php de linha de comandos para executá-lo.
Script no destino
recebe.php - recebe, decodifica e junta os arquivos enviados.