파일 확인 여러 파일 이름 [중복]

파일 확인 여러 파일 이름 [중복]

모든 파일 패턴이 텍스트 파일에 배치되는 시나리오가 있습니다. 이제 텍스트 파일에 있는 모든 파일 패턴 이름을 읽고 해당 이름이 디렉터리에 있는지 확인하는 쉘 스크립트를 작성해야 합니다. 마지막으로 출력은 로그 파일에 기록되어야 합니다.

#!/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)일치하는 항목이 없으면(예: Nglob 한정자 zsh) glob이 null로 확장됩니다.

관련 정보