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 loopwhile
usando uma substituição de processo, porque canalizar sua saída diretamente para o loopwhile
teria deixado$line1
e$line2
fora do% o escopo do loop dewhile
; -
-type f
infind "$path" -type f -name 'php.ini'
pode ser redundante, mas apenas para garantir; - Os dois comandos
echo
poderiam ter sido mesclados em um único comandoecho
, 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 comandosecho
é 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