como fazer um script BASH para encontrar todos os arquivos php.ini na árvore dir e anexar texto a eles

4

Minha empresa de hospedagem anuncia um tamanho de upload php max que pode ir até 60M, mas o padrão é 2M e não posso fazer alterações no arquivo htaccess. Eu posso substituir o padrão alterando os arquivos php.ini, mas isso deve ser feito para cada arquivo php.ini na árvore de diretórios. O que eu e muitos usuários precisam e estão implorando é um script BASH que fará a seguinte tarefa:

  1. recursivamente localize os arquivos php.ini
  2. verificar o arquivo em busca de duas linhas de texto (novas diretivas php)
  3. se não tiver essas duas linhas de texto, acrescente as duas linhas de texto. Salve o arquivo e continue no próximo arquivo.
  4. se tiver essas duas linhas de texto, não faça nada e continue com o próximo arquivo.

Eu descobri como encontrar. -ifile php.ini e acrescente (não corretamente) as duas linhas necessárias para serem adicionadas.

Mesmo com isso, se eu descobrir como anexar as linhas corretamente se for executado novamente, as linhas serão acrescentadas novamente. Não apenas para os novos arquivos que precisam ser corrigidos.

se alguém puder me ajudar com o

find . -ifile php.ini -exec ?????? '{}' \;

parte eu poderia descobrir como fazer o resto sozinho.

    
por Larrykh465 02.09.2015 / 11:58

1 resposta

2

Eu escolheria essa abordagem:

#!/bin/bash
path='/path'
line1='foo'
line2='bar'
while read f; do
    if [ ! "$(grep "$line1" "$f")" ] && [ ! "$(grep "$line2" "$f")" ]; then
        echo "$line1" >> "$f"
        echo "$line2" >> "$f"
    fi
done < <(find "$path" -type f -name 'php.ini')

Algumas notas:

  • $path é declarado / inicializado internamente, mas pode ser passado como um argumento para o script com poucas / poucas modificações, se for mais conveniente;
  • find "$path" -type f -name 'php.ini' é executado em um shell externo e sua saída é redirecionada para o loop while usando uma substituição de processo, porque canalizar sua saída diretamente para o loop while teria deixado $line1 e $line2 fora do% o escopo do loop dewhile;
  • -type f in find "$path" -type f -name 'php.ini' pode ser redundante, mas apenas para garantir;
  • Os dois comandos echo poderiam ter sido mesclados em um único comando echo , mas isso seria necessário para adicionar uma opção -e para escapar da seqüência \n ; sem saber as strings exatas a serem anexadas (que podem conter outras seqüências de escape), não usar uma opção -e e usar dois comandos echo é mais seguro;

O script pesquisa, recursivamente, por qualquer arquivo chamado php.ini no $path caminho; para cada arquivo, se os comandos grep na instrução if não retornarem 0 (ou seja, se nem uma linha contendo / combinando a string $line1 nem uma linha contendo / correspondendo a $line2 string encontrada no arquivo), $line1 e $line2 são acrescentados no final do arquivo.

Exemplo de saída em uma hierarquia de teste:

user@debian ~/tmp % tree -a
.
├── 1
│   ├── 2
│   │   ├── 3
│   │   │   ├── file
│   │   │   └── php.ini
│   │   ├── file
│   │   └── php.ini
│   ├── file
│   └── php.ini
└── script.sh

3 directories, 7 files
user@debian ~/tmp % find 1 -type f -exec bash -c 'echo -e "{}:\n"; cat {}; echo' \;
1/php.ini:

foo
bar
another line

1/file:

foo
bar
another line

1/2/3/php.ini:

foo
bar
another line

1/2/3/file:

foo
bar
another line

1/2/php.ini:

just one line

1/2/file:

foo
bar
another line

user@debian ~/tmp % bash script.sh                 
user@debian ~/tmp % find 1 -type f -exec bash -c 'echo -e "{}:\n"; cat {}; echo' \;
1/php.ini:

foo
bar
another line

1/file:

foo
bar
another line

1/2/3/php.ini:

foo
bar
another line

1/2/3/file:

foo
bar
another line

1/2/php.ini:

just one line
foo
bar

1/2/file:

foo
bar
another line
    
por kos 02.09.2015 / 14:03