Como posso mover ou excluir arquivos criados em determinado intervalo de tempo?

0

Estou fazendo filmes com intervalos de tempo que duram várias semanas e quero me livrar das fotos tiradas durante a noite (ou seja, entre 22:45 e 5:00 neste caso), como posso fazer isso facilmente?

Encontrei as seguintes soluções parciais:

  • Usar find -newerXY e especificamente -newermt seria possível, mas exige que eu faça um loop de todas as datas também
  • Usando stat para consultar o mtime, mas não sei como comparar facilmente os tempos no bash.

Agora estou fazendo isso manualmente, mas tenho certeza de que deve haver uma solução mais elegante. Alguma ideia? Obrigado! :)

    
por Tim 22.07.2017 / 18:52

2 respostas

1

Com stat (assume todos os arquivos no mesmo diretório)

stat -c '%y %n' * | grep -E ' (22:4[5-9]|22:5|23:|0[0-4]:)' | cut -d ' ' -f 4 | xargs mv -t $dirForRemovedFiles
  • isso assume que na saída de stat não depende da localidade (não parece ser ...), caso contrário, force a localidade para "C".
  • isso pressupõe que todos os arquivos estejam no mesmo segmento de horário de verão.
  • anote o espaço entre a citação e o parêntese, é isso que faz com que o regexp corresponda apenas ao início do registro de data e hora.
  • por segurança, o comando acima não exclui nada, apenas move os arquivos para um diretório no qual você emitirá um rm * depois de afirmar que não está faltando nada.
  • se você for paranóico, use grep -E '^.{10} (22:4[5-9]|22:5|23:|0[0-4]:)' para evitar resultados falsos.
por 22.07.2017 / 21:59
1

Esta linha semi-única imprime os arquivos "noturnos":

( \
llimit=$((60*5+0)); \
ulimit=$((60*22+45)); \
find -type f -exec bash -c '\
hm='stat -c "%y" "$0" | cut -c 12-16'; \
t=$((60*10#'echo $hm | cut -c 1-2'+10#'echo $hm | cut -c 4-5')); \
test \( $t -lt $1 \) -o \( $t -gt $2 \)' \
{} $llimit $ulimit \; \
-print \
)

Sub linhas explicadas:

  1. Inicia um subshell para tornar as variáveis locais.
  2. Calcula o limite inferior em minutos depois da meia-noite.
  3. Calcula o limite superior.
  4. Para cada arquivo, um bash separado é executado; fará a aritmética.
  5. Extrai o mtime como HH:MM .
  6. Converte HH:MM em um valor como minutos depois da meia-noite.
  7. Compara esse valor com limites pré-calculados.
  8. Estes são argumentos para o interior bash ; dentro, eles são referidos como $0 , $1 , $2 .
  9. Imprime o caminho se o teste anterior retornar verdadeiro.
  10. Termina o subnível.

Algumas observações:

  • -exec pode atuar como um teste em find invocação. Isso dificilmente é óbvio, mas muito poderoso. Nesse caso, o teste é verdadeiro quando a parte final da linha de comando interna bash (ou seja, test ) retorna verdadeiro (ou seja, seu status de saída é 0 ).
  • A aritmética de bash ( $((…)) ) analisa 01 ou mais como um número octal, 08 e 09 são números octais inválidos. É por isso que precisamos usar 10# para garantir que todos os números extraídos da saída stat sejam interpretados como decimais.
  • usei -lt e -gt em test . Use -le e / ou -ge se eles forem mais adequados para você.
  • Para remover arquivos, substitua -print por -delete (ou use-os juntos: -print -delete ).
  • Para mover arquivos para um único diretório, substitua -print por -print0 e crie um canal como este:

    ( … find … -print0 ) | xargs -0r mv -t /target/directory/
    
por 22.07.2017 / 20:35