Verificação de arquivos para vários nomes de arquivos [duplicados]

0

Eu tenho um cenário onde todos os meus padrões de arquivo são colocados em um arquivo de texto. Agora eu preciso escrever um script de shell para ler cada nome de padrão de arquivo presente no arquivo de texto e verificar se ele existe no diretório ou não. A saída deve ser gravada em um arquivo de log no final.

#!/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"

O código acima está listando os arquivos. Mas eu também preciso imprimir a contagem (número de arquivos para cada nome de cada arquivo.

    
por user187297 30.08.2016 / 14:22

1 resposta

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 , como o shell Bourne tem essa característica errada de que quando um padrão não combina, ele se expande para si mesmo. Acima, usamos um teste de existência ( [ -e "$1" ] ) para verificar se estamos no caso de um padrão incomparável, mas note que não é à prova de erros.

Por exemplo, para filepattern='[a-z]' , se [a-z]* não corresponder a nenhum arquivo, o padrão não expandido ( [a-z]* ) pode realmente se referir ao arquivo chamado [a-z]* (que não corresponde ao padrão). / p>

Se o seu ksh for baseado em versões recentes de ksh93 , você poderá corrigi-lo com:

#!/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"

Esse ~(N) faz com que o glob se expanda a nada quando não corresponde (como o qualificador N glob de zsh ).

    
por 30.08.2016 / 15:41