Como apagar arquivos criados entre duas vezes?

3

Eu tenho uma pasta onde eu faço backup dos meus bancos de dados e eu quero excluir todos os backups criados entre 11h e 15h e não importa o dia em que estão - este é o truque!

Eu achei este comando muito útil, mas não no meu caso de uso:

find . -type f -newermt '01 nov 2018 00:00:00' -not -newermt '10 nov 2018 00:00:00' -delete

Mas aqui me força a um intervalo entre duas datas! Desejo excluir apenas os backups criados entre dois horários específicos.

    
por Ismail Sensei 12.09.2018 / 14:38

2 respostas

4

Simplesmente, já que você marcou , você tem o% Comandostat disponível, que extrairá o tempo de modificação de um arquivo, e o comando GNU date , que extrairá a hora de um dado momento:

find . -type f -exec sh -c '
  h=$(date -d @$(stat -c %Y "$1") +%-H); [ "$h" -ge 11 ] && [ "$h" -lt 15 ]' \
  sh {} \; -ls

Se os resultados parecem corretos, então:

find . -type f -exec sh -c '
  h=$(date -d @$(stat -c %Y "$1") +%-H); [ "$h" -ge 11 ] && [ "$h" -lt 15 ]' \
  sh {} \; -delete

Aqui está uma execução de teste com a versão -ls :

$ touch -d 'Wed Sep 12 11:00:01 EDT 2018' 11am
$ touch -d 'Wed Sep 12 12:00:02 EDT 2018' 12pm
$ touch -d 'Wed Sep 12 15:00:03 EDT 2018' 303pm
$ find . -type f -exec sh -c 'h=$(date -d @$(stat -c %Y "$1") +%-H); [ "$h" -ge 11 ] && [ "$h" -lt 15 ]' sh {} \; -ls
1705096    0 -rw-r--r--   1 user group 0 Sep 12  2018 ./11am
1705097    0 -rw-r--r--   1 user group 0 Sep 12  2018 ./12pm

Agradecemos a Kusalananda por escrever a excelente resposta que eu segui, em: Entendendo a opção -exec de 'find'

Observe que não queremos a {} + versão de find aqui, pois queremos que os resultados de -exec sejam por arquivo, para que possamos excluir apenas arquivos que correspondam ao intervalo de tempo.

O script de shell incorporado possui duas partes principais: determinar o registro de data e hora "hora" do arquivo e, em seguida, retornar sucesso ou falha com base no intervalo. A primeira parte é realizada em duas partes. A variável é atribuída ao resultado da substituição do comando; o comando deve ser lido de dentro para fora:

  1. $(stat -c %Y "$1") - esta (segunda) chamada de substituição de comandos stat no parâmetro $1 do script de shell incorporado; $1 foi atribuído por find como um dos nomes de caminho encontrados. A opção% Y para o comando stat retorna o tempo de modificação em segundos desde a época.
  2. date -d @ ... +%-H - isso leva os segundos desde a época da substituição do comando acima e pede que date nos forneça a parte Horas desse tempo; a @ sintaxe informa date que estamos dando segundos desde a época como um formato de entrada. Com a opção - no formato de saída da data, informamos a data do GNU para não preencher o valor com qualquer zeros à esquerda. Isso evita qualquer má interpretação posterior.

Quando tivermos a variável $h Hour atribuída, usamos o operador condicional bash [[ para perguntar se esse valor é maior que ou igual a 11 e também estritamente menor que 15.

    
por 12.09.2018 / 15:12
0

Não é o ideal, mas isso pode ser útil.

find . -type f -print | while read l; do
    hour=$(stat -c "%z" ${l} | awk '{print $2}' | awk -F: '{print $1}')
    if [[ 11 -le ${hour} ]] && [[ ${hour} -le 15 ]]; do
      rm -f ${l}
    done
done

Espero que isso ajude

    
por 12.09.2018 / 15:07