Localizando e excluindo arquivos com uma data específica

4

como excluir os arquivos criados em Aug 7 com o nome DBG_A_sql*  em /tmp

como o exemplo a seguir:

-rw-r--r-- 1 root    root   51091 Aug  7 11:22 DBG_A_sql.2135
-rw-r--r-- 1 root    root   15283 Aug  7 11:22 DBG_A_sql.2373
-rw-r--r-- 1 root    root   51091 Aug  7 11:22 DBG_A_sql.2278
-rw-r--r-- 1 root    root    9103 Aug  7 11:22 DBG_A_sql.2485
-rw-r--r-- 1 root    root    9116 Aug  7 11:22 DBG_A_sql.2573
-rw-r--r-- 1 root    root    9140 Aug  7 11:22 DBG_A_sql.2679
-rw-r--r-- 1 root    root   15695 Aug  7 11:22 DBG_A_sql.2897
    
por yael 08.08.2016 / 09:50

4 respostas

9

Você pode usar find . Calcular data de acordo com sua exigência e uso,

find /tmp -maxdepth 1 -mtime -1 -type f -name "DBG_A_sql*" -print

Depois de confirmar, exclua-os,

find /tmp -maxdepth 1 -mtime -1 -type f -name "DBG_A_sql*" -delete
    
por 08.08.2016 / 10:03
5

Para começar, encontrar arquivos criados em um determinado momento é um pouco difícil, uma vez que o tempo de criação não é normalmente salvo em qualquer lugar ou é difícil de alcançar. O que você tem é mtime , ou a hora da última modificação, e ctime , que é a hora da "alteração", atualizada em qualquer alteração no inode. Eu suponho que você quer o tempo de modificação.

Encontrar arquivos modificados em uma determinada data revelou-se um pouco interessante, já que find parece dificultar um pouco o processo de criar arquivos exatamente na meia-noite.

Se soubermos o tempo relativo (ou seja, ontem), poderíamos usar find -daystart -mtime 1 , mas encontra o arquivo modificado na meia-noite errada, Aug 8 00:00 . No entanto, isso parece funcionar:

find dir/ -daystart -mtime +0 \! -mtime +1 -ls

Se não quiser calcular o tempo relativo, e seu find tem -newerXY :

find dir/ -newermt 'Aug 7 00:00' \! -newermt 'Aug 8 00:00' -ls

Novamente, isso cria os arquivos exatamente à meia-noite, porque a comparação é "mais recente", não "mais recente ou antiga". Porém, se o seu sistema tiver uma precisão de subsegundo para registros de data e hora, pode ser difícil atingir isso, mas acontece se você testar arquivos criados por touch ...

Uma solução alternativa para isso seria algo assim:

find dir/ -newermt 'Aug 6 23:59:59.999999999' \! -newermt 'Aug 7 23:59:59.999999999' -ls

Em qualquer caso, adicione o -name "DBG_A_sql*" necessário para obter apenas os arquivos com o nome correto. Você pode substituir o -ls no final com -delete para excluir os arquivos em vez da listagem. ( -ls , -delete e -newerXY existem pelo menos no GNU find e o BSD encontra no OS X.)

É claro que você poderia realmente analisar a representação de texto da data, mas ls torna difícil acertar se algum joker criar arquivos com caracteres não imprimíveis neles. Claro, os arquivos de exemplo não têm tal coisa, mas em geral, qualquer um poderia criá-los, especialmente em /tmp .

(Embora com | xargs rm você só perderia esses arquivos, e como os nomes dos arquivos não podem conter barras, seria difícil alguém apontar seu rm para outro diretório.)

    
por 08.08.2016 / 10:55
4

Apenas o laço bash

for file in /tmp/DBG_A_sql* ; do
    [ "$(date -I -r "$file")" == "2016-08-07" ] && rm "$file"
done
    
por 08.08.2016 / 11:00
2

Assumindo que por criado , você quer dizer última modificação (que é a hora reportada por ls -l ), com zsh :

autoload age # best in ~/.zshrc
rm /tmp/DBG_A_sql*(e:age 2016-08-07:)
    
por 08.08.2016 / 12:24

Tags