Não leia todo o arquivo apps.txt
em um loop for
. No caso geral, isso poderia causar problemas de memória se o arquivo fosse grande, e causaria problemas se algum nome de arquivo em apps.txt
tivesse espaços neles. Não faça um loop pela saída de ls
. Além disso, cite expansões de variáveis e use printf
para gerar dados variáveis.
Relacionados:
- Por que * não * analisar 'ls'?
- Por que o printf é melhor que o eco?
- Por que meu script de shell se sufoca em espaços em branco ou outros caracteres especiais?
- Implicações de segurança de esquecer de citar uma variável em shells bash / POSIX
Sugestão:
#!/bin/sh
appdir='/local/apps/oracle/Middleware/user_projects/epmsystem1/EssbaseServer/essbaseserver1/app'
outdir='/data/shellscripts/essbase/Operate/Overlays'
while IFS= read -r app; do
printf '%s\n' "$app"
for name in "$appdir/$app"/*.rul; do
printf '%s\n' "${name##*/}"
strings "$name"
done
done <apps.txt >"$outdir/rules1.txt"
Isso leria app
do arquivo apps.txt
e acessaria todos os arquivos *.rul
no subdiretório correspondente em $appdir
. As seqüências de caracteres $app
e ${name##*/}
(o nome de base do arquivo *.rul
atual) seriam produzidas em cada iteração, junto com a saída de strings
. A saída iria para o arquivo $outdir/rules1.txt
.
Também relacionado (à minha solução):