Renomear Múltiplos arquivos gzips e deletar mais de 10 dias

4

Sou novo no Linux / Unix e, lentamente, aprendo passo a passo. Infelizmente na entrevista de emprego de hoje foi surpreendido por uma tarefa a fazer (o que obviamente eu não sabia). Fui solicitado a preparar um script bash que:

  • altera os nomes de .log. arquivos para (nome). (data) .log. (parte restante do nome original) e gzips para um arquivo .gz.

  • exclui (nome). (data) .log (parte restante do nome original) .gz arquivos com mais de 10 dias.

Nunca é tarde demais para perguntar e realmente apreciaria se você pudesse me informar como deveria ser.

    
por Michael 30.05.2016 / 21:15

2 respostas

2

Assumindo as ferramentas GNU, eu faria algo como

find . -type f \( -name '*.[0-9][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9].log.*.gz' \
       \( -mtime -10 -o -delete -o -true \) -o -name '*.log.*' ! -name '*.gz' \
       \( -mtime +9 \( -delete -o -true \) -o -printf '%TF/%p
find . -type f \( -name '*.[0-9][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9].log.*.gz' \
       \( -mtime -10 -o -delete -o -true \) -o -name '*.log.*' ! -name '*.gz' \
       \( -mtime +9 \( -delete -o -true \) -o -printf '%TF/%p%pre%' \) \) |
  while IFS=/ read -rd '' date file; do
    basename=${file##*/}
    dirname=${file%/*}
    newfile=$dirname/${basename%.log.*}.$date.log.${basename##*.log.}
    mv "$file" "$newfile" && gzip "$newfile"
  done
' \) \) | while IFS=/ read -rd '' date file; do basename=${file##*/} dirname=${file%/*} newfile=$dirname/${basename%.log.*}.$date.log.${basename##*.log.} mv "$file" "$newfile" && gzip "$newfile" done
    
por 30.05.2016 / 23:47
2
#!/bin/bash

workdir="/tmp/myfilestomove"
#cd "$workdir"
[ ! -e "$workdir" ] && exit 

find -type f "$workdir" | grep -v '.gz' | while read file; do
     filedate="$(date -r "$file" +%d%m%Y)"
     basename="${file%.*}"
     extension="${file##*.}"
     echo mv "$file" "${basename}.${filedate}.${extension}" 
     echo gzip "${basename}.${filedate}.${extension}"
done


find -type f -mtime +10 "$workdir" | while read file; do
     echo rm "$file"
done

Remova o eco somente se você testou o script e faça um backup de seus arquivos antes do primeiro uso.

    
por 30.05.2016 / 21:40