我需要读取多个文件的内容,目前我可以使用下面的代码读取一个文件的内容,此代码使用“strings”进一步读取“rules1.txt”中存在的内容。我只需要相同的功能,但需要在“apps.txt”中读取多个文件。
for i in $(cat apps.txt);
do
cd /local/apps/oracle/Middleware/user_projects/epmsystem1/EssbaseServer/essbaseserver1/app/$i
echo $i >> /data/shellscripts/essbase/Operate/Overlays/rules1.txt done
for i in $(ls *.rul);do
echo $i >> /data/shellscripts/essbase/Operate/Overlays/rules1.txt
strings $i >> /data/shellscripts/essbase/Operate/Overlays/rules.txt
答案1
不要将整个apps.txt
文件读入for
循环。在一般情况下,如果文件很大,这可能会导致内存问题,如果文件名中apps.txt
有空格,也会导致问题。不要循环 的输出ls
。另外,引用变量扩展并用于printf
输出变量数据。
有关的:
建议:
#!/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"
这将从文件app
中读取apps.txt
并访问*.rul
下相应子目录中的所有文件$appdir
。字符串$app
和${name##*/}
(当前*.rul
文件的基本名称)将在每次迭代中与strings
.输出将转到$outdir/rules1.txt
文件。
还相关(与我的解决方案):
答案2
从这篇文章:https://stackoverflow.com/a/1689063/1195001
while read i ; do
cd /local/apps/oracle/Middleware/user_projects/epmsystem1/EssbaseServe/essbaseserver1/app/$i
echo $i >> /data/shellscripts/essbase/Operate/Overlays/rules1.txt
done < apps.txt
While 比 for 更适合这项任务。