No lea todo el archivo apps.txt
en un bucle for
. En el caso general, esto podría causar problemas de memoria si el archivo es enorme, y podría causar problemas si algún nombre de archivo en apps.txt
tuviera espacios. No repita la salida de ls
. Además, cite expansiones de variables y use printf
para generar datos variables.
Relacionado:
Sugerencia:
#!/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 "$outdir/rules1.txt"
Esto leería app
del archivo apps.txt
y accedería a todos los archivos *.rul
en el subdirectorio correspondiente bajo $appdir
. Las cadenas $app
y ${name##*/}
(, el nombre base del archivo *.rul
actual ), se generarían en cada iteración, junto con la salida de strings
. La salida iría al archivo $outdir/rules1.txt
.
También relacionado (con mi solución):
Существует некоторое отвращение к синтаксическому анализу вывода ls (см.https://mywiki.wooledge.org/ParsingLsсреди прочих ), но это в стороне:
ls -d -- 0.*_*.txt
Я не знаю, почему вы поставили --
там; -d
просто мешает вам спускаться в каталоги. В вашем наборе -вам, вероятно, не понадобится ни то, ни другое.
ls
будет генерировать имена файлов, такие как 0.230_0.203059.txt
, поэтому с txt. Вам нужно будет раздеть и это.
ls 0.*_*.txt | sort -t. -k1 | sed 's/.txt//;s/_/ /' > outfile.txt
должен сделать это.