quarta-feira, 26 de setembro de 2012

Ordenar a saída do comando ls a partir de um substring do nome dos arquivos listados

Recentemente, me deparei com uma situação inusitada e precisei fazer um shell script para resolver.

Um fornecedor envia uns arquivos para serem processados em ordem de criação, mas não adianta ordenar por data/hora de criação porque é comum criar arquivos retroativos, ou seja, tem que ordenar pelo nome (que contém data e hora no formato DDMMYY).
Por causa do formato de data usado na formação do nome do arquivo, a ordem de processamento por nome também pode falhar.

Formato do nome do arquivo:  arq_DDMMYYHHMISS

O script (abaixo), pega a saída do comando "ls", trata parte do nome dos arquivos e ordena por essa parte (no caso, inverte o formato da data contido no nome de cada arquivo).

No final, retorna a lista com o nome completo do arquivo conforme nova ordenação.

Script
_______________________________________________________________
#!/bin/ksh
ls -l >/dev/null 2>/dev/null
if [ $? = 0 ]
then
   directory=/home0/users/josbar
   if [ -e $directory/temp.txt ]
   then
     rm $directory/temp.txt
   fi

   for FILE_RCV in $directory/arqpro*
   do
      if [ -s $FILE_RCV ]
      then
        file_name=`basename $FILE_RCV`
        seg=$(echo $file_name | cut -c18-19)
        min=$(echo $file_name | cut -c16-17)
        hor=$(echo $file_name | cut -c14-15)
        day=$(echo $file_name | cut -c8-9)
        month=$(echo $file_name | cut -c10-11)
        year=$(echo $file_name |cut -c12-13)
        order_by=$year$month$day$hor$min$seg
        echo $order_by - $FILE_RCV >> $directory/temp.txt
      fi
   done
   cat $directory/temp.txt | sort -n | cut -c16-55
fi
_____________________________________________________________

Nenhum comentário: