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