Linux: usando find para localizar arquivos anteriores a <data>

31

findtem um bom suporte para encontrar arquivos mais modificados há menos de X dias atrás, mas como posso usar findpara localizar todos os arquivos modificados após uma determinada data?

Não consigo encontrar nada na findpágina do manual para fazer isso, apenas para comparar com o tempo de outros arquivos ou verificar se há diferenças entre o tempo criado e o agora. Criar um arquivo com o tempo desejado e comparar com ele é a única maneira de fazer isso?

DrStalker
fonte
11
Isso seria melhor perguntado em SuperUser.com
Josh Brower
6
Não vou fechar isso: também pode ser interessante para administradores de sistemas.
splattne
O comando é parte de um script de backup, que captura tudo do / etc que foi alterado após a instalação em nossos backups noturnos.
DrStalker
Nove anos e acabei de notar ao moderar uma nova resposta: o título e o corpo desta pergunta não são iguais. O título solicita 'arquivos mais antigos que <data>', mas o corpo declara 'modificado após uma certa data'. Eu interpreto 'depois' como mais recente que uma data específica, não como mais antiga.
Joffrey

Respostas:

19

Se você tiver apenas '-newer file', poderá executar esta solução alternativa:

touch -t 201003160120 some_file
find . -newer some_file

homem toque:

  -t STAMP
          use [[CC]YY]MMDDhhmm[.ss] instead of current time

Supondo que seu toque tenha essa opção (o meu é o toque 5,97).

Krzysztof Krasoń
fonte
48

Não, você pode usar uma sequência de data / hora.

De man find:

-newerXY reference
Compara o registro de data e hora do arquivo atual com a referência. O argumento de referência normalmente é o nome de um arquivo (e um de seus registros de data e hora é usado para a comparação), mas também pode ser uma string que descreve um tempo absoluto. X e Y são espaços reservados para outras letras, e essas letras selecionam o horário pertencente a como a referência é usada para a comparação.

          a   The access time of the file reference
          B   The birth time of the file reference
          c   The inode status change time of reference
          m   The modification time of the file reference
          t   reference is interpreted directly as a time

Exemplo:

find -newermt "mar 03, 2010" -ls
find -newermt yesterday -ls
find -newermt "mar 03, 2010 09:00" -not -newermt "mar 11, 2010" -ls
Pausado até novo aviso.
fonte
5
Estou usando Centos 5.2, que usa GNU encontrar a versão 4.2.27, e ele não suporta -newermt ou qualquer -newer parâmetro diferente de "arquivo -newer"
DrStalker
11
GNU Findutils 4.3.3 e mais novos suportes -newerXY acordo com savannah.gnu.org/bugs/?11668
Philip Durbin
25

Não está diretamente relacionado à pergunta, mas pode ser interessante para alguns que tropeçam aqui.

O comando find não suporta diretamente o parâmetro -older para localizar arquivos com mais de uma data necessária, mas você pode usar a declaração negate (usando o exemplo de resposta aceito):

touch -t 201003160120 some_file
find . ! -newer some_file

retornará arquivos mais antigos que a data fornecida.

nEJC
fonte
3
editores - talvez deva ser mesclado em resposta aceita?
NEJC 06/09/12
esta solução é a maneira mais elegante para resolver este tipo de problema :)
Labynocle
9
find <dir> -mtime -20

este comando find encontrará arquivos modificados nos últimos 20 dias.

  • mtime -> modificado (atime = acessado, ctime = criado)
  • -20 -> menos de 20 dias (20 exatamente 20 dias, +20 mais de 20 dias)

Você pode adicionar limitações adicionais, como:

find <dir> -mtime -20 -name "*.txt"

o mesmo de antes, mas só encontra arquivos que terminam com '.txt'.

markus_b
fonte
5

Apenas para adicionar - você pode até usar dois argumentos newermt para pesquisar em um intervalo de tempo:

find ! -newermt "apr 01 2007" -newermt "mar 01 2007" -ls

para encontrar todos os arquivos de março de 2007.

MortenSickel
fonte
1

Você poderia usar um script como este

#!/bin/bash

if [ $# -ne 1 ];then
  when="today"
else
  when=` date -d "$1" +"%s" `
fi
now=`date +"%s"`

seconds=`echo "$when - $now" | bc`
minutes=`echo "$seconds / 60 " | bc `

find . -cmin $minutes -print

Salve-o no seu $ PATH como "newerthan" e torne-o executável.

Então você pode encontrar o arquivo modificado após uma certa data como esta:

newerthan "2010-03-10"

ou

newerthan "last year"

ou

newerthan "yesterday"

Isso deve fazer o que você quer. Eu não acho que haja uma maneira construída de conseguir isso de outra maneira.

Richard Holloway
fonte
Não é necessário usar bcpara matemática inteira, o Bash pode fazer isso ((seconds = when - now)):, o argumento de formato datedeve ter um sinal de adição date +%se alguns sistemas podem não terdate -d
Pausado até novo aviso.
Isso é para o Centos 5.2. Qual tem -d. Útil para saber sobre a matemática inteira.
Richard Holloway
1
find ! -newermt “<DATE>”

como isso:

find ! -newermt “jan 01 2015” 

Isso fornecerá arquivos com mais de 01-01-2015 no diretório atual.

https://muzaffarmahmoodblog.wordpress.com/2019/07/11/linux-command-to-remove-files-older-than-2015-in-a-directory/

Muzaffar Mahmood
fonte
Eu estava prestes a escrever um comentário para recebê-lo no ServerFault e solicitando que você reconsidere colocar uma resposta duplicada até perceber que o título e o corpo da pergunta dizem coisas diferentes: o título solicita 'arquivos anteriores a <data>' e os estados da pergunta 'modificados depois de uma certa data ', que na minha opinião são duas coisas diferentes. Talvez você possa, em seu post, esclarecer a diferença e explicar o uso do negar. Obrigado por contribuir e publicarei um comentário sobre a questão para esclarecimentos. Obrigado por contribuir!
Joffrey
0

se a sua data estiver formatada de forma a que esteja bem para comparação,

mydate=201003160120
find . -type f -printf "%AY%Am%Ad%AH%AM%AS/:%p\n" | awk -vd="$mydate" -F'/:' '$1 > d{ print $2 }'
user37841
fonte