모든 파일 패턴이 텍스트 파일에 배치되는 시나리오가 있습니다. 이제 텍스트 파일에 있는 모든 파일 패턴 이름을 읽고 해당 이름이 디렉터리에 있는지 확인하는 쉘 스크립트를 작성해야 합니다. 마지막으로 출력은 로그 파일에 기록되어야 합니다.
#!/bin/ksh
file="/usr/opt/filenames.txt"
mondir=/home/pavan
while read line
do
# display list of files with the pattern in the monitoring directory
filename=$line
ls -lrt $mondir/$filename*
done <"$file"
위의 코드는 파일을 나열합니다. 하지만 카운트(파일 패턴 이름당 파일 수)도 인쇄해야 합니다.
답변1
#!/bin/ksh -
file="/usr/opt/filenames.txt"
mondir=/home/pavan
IFS=
while read -r filepattern
do
set -- "$mondir"/$filepattern*
if [ "$#" -eq 1 ] && [ ! -e "$1" ] && [ ! -L "$1" ]; then
printf '%s\n' "$filepattern: 0"
else
printf '%s\n' "$filepattern: $#"
ls -lrtd -- "$@"
fi
done <"$file"
ksh
, Bourne 쉘에는 패턴이 일치하지 않을 때 자체적으로 확장되는 오류 기능이 있는 것과 같습니다. 위에서 패턴 불일치 상황을 확인하기 위해 존재 테스트( )를 사용했지만 [ -e "$1" ]
, 이것이 완벽한 것은 아니라는 점에 유의하시기 바랍니다.
예를 들어, 일치하는 파일이 filepattern='[a-z]'
없으면 [a-z]*
확장되지 않은 패턴( [a-z]*
)은 실제로 호출되는 파일 [a-z]*
(패턴과 일치하지 않음)을 참조할 수 있습니다.
ksh
최신 버전을 기반으로 하는 경우 ksh93
다음을 사용하여 문제를 해결할 수 있습니다.
#!/bin/ksh -
file="/usr/opt/filenames.txt"
mondir=/home/pavan
IFS=
while read -r filepattern
do
set -- "$mondir"/~(N)$filepattern*
printf '%s\n' "$filepattern: $#"
[ "$#" -eq 0 ] || ls -lrtd -- "$@"
done <"$file"
이로 인해 ~(N)
일치하는 항목이 없으면(예: N
glob 한정자 zsh
) glob이 null로 확장됩니다.