ファイルの確認複数のファイル名[重複]

ファイルの確認複数のファイル名[重複]

すべてのファイルパターンがテキストファイルに配置されるシナリオがあります。これで、テキストファイル内のすべてのファイルパターン名を読み取り、その名前がディレクトリにあることを確認するシェルスクリプトを作成する必要があります。最後に、出力はログファイルに書き込む必要があります。

#!/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に展開されます。

関連情報