여러 파일의 내용을 읽어야 합니다. 현재 아래 코드를 사용하여 한 파일의 내용을 읽을 수 있습니다. 이 코드는 "문자열"을 사용하여 "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
또한 (내 솔루션과 관련하여) 다음과 같습니다.
답변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
for보다 while이 이 작업에 더 적합합니다.