filtra o arquivo para uma data específica

2

Meu sistema operacional é Solaris 10 (64 bits) e tenho muitos arquivos em um diretório de logs, onde recebemos 40 a 50 logs por dia. Eu tenho 20 últimos dias arquivo presente neste diretório e quero mover cada dia arquivo para um diretório específico cujo nome é anexado com a data do arquivo.

Por exemplo

File_name  date
1.txt      31-jul-20122 
2.txt      01-Aug-2012

crie um diretório para arquivos antigos que pertença a 31-jul-2012 e mova para o novo diretório 31-jul RIO_31-Jul-2012 e mova-os e faça o mesmo para arquivos de 01-ago.

Eu escrevi um script que está funcionando bem para a data atual, mas não sei como modificá-lo para acomodar a data antiga.

Meus scripts são como abaixo

NEWDIR=RIO_31-Jul-2012
mkdir /ersdg3/ERS/ERS_INPUT_LOGS/RIO/LOGS/$NEWDIR
cd /var/opt/ers/logs/rio
touch -t 'date +%Y%m%d0000' dummy
find . -newer dummy -type f  |
while read fname
do
    mv $fname /ersdg3/ERS/ERS_INPUT_LOGS/RIO/LOGS/$NEWDIR
done
    
por rajesh 02.08.2012 / 13:57

2 respostas

1

No Solaris, você pode obter a data de um arquivo em um formato utilizável com ls -E .

Itere todos os arquivos no diretório de log. Para cada arquivo, obtenha a data, crie o diretório de destino, se necessário, e mova o arquivo.

for f in /var/opt/ers/logs/rio/*; do
  ymd=$(ls -Eog "$f" | awk '{print $4}')
  target=/ersdg3/ERS/ERS_INPUT_LOGS/RIO/LOGS/RIO_$ymd
  mkdir -p "$target"
  mv "$f" "$target"
done

Observe que os diretórios de arquivamento terão nomes como RIO_2012-07-31 em vez de RIO_31-Jul-2012 . Eu recomendo o formato Y-M-D porque ele classifica em ordem cronológica. Se você realmente precisa ter nomes de mês abreviados e o pedido DMY, use ls -e em vez de ls -E e altere a chamada awk de acordo:

  mdy=$(ls -eog "$f" | awk '{print $5 "-" $4 "-" $7}')

Se você precisar procurar arquivos em subdiretórios recursivamente, chame find para iterar todos os arquivos e, novamente, execute o fragmento de shell para cada arquivo.

find /var/opt/ers/logs/rio -type f -exec sh -c '
  ymd=$(ls -Eog "$0" | awk "{print \}")
  target=/ersdg3/ERS/ERS_INPUT_LOGS/RIO/LOGS/RIO_$ymd
  mkdir -p "$target"
  mv "$0" "$target"
' {} \;

Com find , você pode adicionar ! -newer somefile antes de -exec para corresponder somente arquivos que são mais antigos que somefile . Você pode adicionar -mtime 42 para corresponder apenas aos arquivos que foram modificados há pelo menos 42 dias.

    
por 03.08.2012 / 03:36
0

Você pode encontrar arquivos por ctime o atime e, em seguida, mover os arquivos listados no diretório à direita:

find . -iname "*.txt" -ctime -<daysago> -type f

"days ago" é um inteiro.

    
por 02.08.2012 / 18:01

Tags