複数のファイルの内容を読む必要があります。現在、以下のコードを使用して1つのファイルの内容を読み取ることができます。このコードは、「文字列」を使用して「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
変数データを出力するためにも使用されます。
関連:
- なぜ`ls`を解析しないのですか?
- なぜprintfがechoより優れているのですか?
- スペースやその他の特殊文字が原因でシェルスクリプトが停止するのはなぜですか?
- bash / POSIXシェルで変数を引用することを忘れてしまうセキュリティリスク
提案:
#!/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
また、(私の解決策に関して)