Como usar 'find' para procurar arquivos criados em uma data específica? [fechadas]

254

Como uso o comando UNIX findpara procurar arquivos criados em uma data específica?

sverrejoh
fonte
8
Parece que perguntas de script bash são permitidas.
21373 Alan
@ MichaelScheper: Eu nem sei por onde começar com esse comentário.
Lightness Races em órbita
1
@ Notinlist: Aqui está a resposta: meta.stackexchange.com/questions/10249/… Infelizmente, parece que um prazo expirou. Pena, já que as pesquisas na web ainda chegam aqui, e a resposta aceita foi útil para muitas pessoas.
Michael Scheper
@ MichaelScheper: Se você puder encontrar uma opção para votar na migração para o unix.stackexchange.com, por todos os meios me aponte para ela. Como você não tem o representante para ver a caixa de diálogo fechar, darei uma dica: não há uma. Considere ser menos combativo quando não tiver ideia do que está falando. Agradecimentos para sua atenção.
Lightness Races in Orbit
5
@LightnessRacesinOrbit: Peço desculpas por parecer 'combativo'. Não tenho permissão para editar meus comentários, mas para referência futura, foi meu comentário elogiando a pergunta que o ofendeu? Devo dizer que estou me sentindo um pouco cego, mesmo depois de dar ao seu comentário anterior o benefício da dúvida. Na verdade, eu estava tentando ser mais construtivo do que adicionar outro 'eu também', pesquisando como a migração funciona: meta.stackexchange.com/a/10250/249555 O prazo de 60 dias oculta essa opção, talvez? Desculpe pelo boi boi. Obrigado novamente - sinceramente - pelo seu tempo e atenção.
Michael Scheper

Respostas:

323

Como apontado por Max, você não pode, mas a verificação de arquivos modificados ou acessados ​​não é tão difícil. Eu escrevi um tutorial sobre isso, ainda hoje. A essência do qual é usar -newerXYe ! -newerXY:

Exemplo: para encontrar todos os arquivos modificados em 7 de junho de 2007:

$ find . -type f -newermt 2007-06-07 ! -newermt 2007-06-08

Para encontrar todos os arquivos acessados ​​em 29 de setembro de 2008:

$ find . -type f -newerat 2008-09-29 ! -newerat 2008-09-30

Ou arquivos com permissão alterada no mesmo dia:

$ find . -type f -newerct 2008-09-29 ! -newerct 2008-09-30

Se você não alterar as permissões no arquivo, 'c' normalmente corresponderia à data de criação.

Arve
fonte
7
Minha versão do find (GNU 4.2.32) parece não suportar os predicados -newerXY. É necessária uma versão mínima específica? Ou é um caso de compilação de localização com um comutador de configuração especial?
Yukondude 01/10/08
1
@yukondude: Você está certo. A versão do find que eu tenho localmente - GNU 4.4.0 - possui, enquanto o 4.1.20 que eu tenho no Dreamhost não. O kludge com a criação de dois arquivos também deve funcionar.
Arve
1
Em alguns sistemas (FreeBSD, OS / X ...) -newerBtcorresponderá ao horário de nascimento (criação) do arquivo .
Stephane Chazelas
3
Observe que ele -newerxtestá disponível no FreeBSD desde 2001 (onde foi fornecido pela primeira vez como patch em 1998), alguns outros BSDs e GNU encontram (desde 4.3.3 em 2007), com base no HP / UX find, que foi introduzido -newerXY(mas onde Y == t não é suportado).
Stephane Chazelas
Usando: find (GNU findutils) 4.4.0, essa sintaxe não funciona no SUSE ext3, se ele deveria listar arquivos / w mtime nessa data, não retorna nada
niken
68

find location -ctime time_period

Exemplos de time_period:

  • Há mais de 30 dias: -ctime +30

  • Menos de 30 dias atrás: -ctime -30

  • Exatamente há 30 dias: -ctime 30

Chris
fonte
7
O problema é que eu quero testar para uma data específica, não dentro de um período de tempo.
Sverrejoh 01/10/08
1
Então, descubra quantos dias atrás isso é e use esse número.
Jkfreitas1
15
ctimenão tem nada a ver com o tempo de criação , é o tempo de mudança do inode.
Stephane Chazelas
47

São duas etapas, mas eu gosto de fazer desta maneira:

Primeiro, crie um arquivo com uma data / hora específica. Nesse caso, o arquivo é 01/10/2008 à meia-noite

touch -t 0810010000 /tmp/t

Agora podemos encontrar todos os arquivos mais recentes ou mais antigos que o arquivo acima (passando pela data de modificação do arquivo. Você também pode usar -anewer para o status do arquivo acessado e -cnewer alterado).

find / -newer /tmp/t
find / -not -newer /tmp/t

Você também pode procurar arquivos entre determinadas datas criando dois arquivos com toque

touch -t 0810010000 /tmp/t1
touch -t 0810011000 /tmp/t2

Encontrará arquivos entre as duas datas e horários

find / -newer /tmp/t1 -and -not -newer /tmp/t2
Mark Biek
fonte
3
+1 para solução para um mais antigo findque carece-newerXY
Felipe Alvarez
1
IMO, agora essa deve ser a solução aceita. Não consegui que o -newermt fosse executado no kernel 2.6.18-348.18.1.el5, muito menos nos kernels mais recentes.
DarkForce 20/05
O mesmo aqui no DarkForce, a funcionalidade newermt parece ser muito instável
niken
34

Você pode fazer isso:

find ./ -type f -ls |grep '10 Sep'

Exemplo:

[root@pbx etc]# find /var/ -type f -ls | grep "Dec 24"
791235    4 -rw-r--r--   1 root     root           29 Dec 24 03:24 /var/lib/prelink/full
798227  288 -rw-r--r--   1 root     root       292323 Dec 24 23:53 /var/log/sa/sar24
797244  320 -rw-r--r--   1 root     root       321300 Dec 24 23:50 /var/log/sa/sa24
Jeff MacDonald
fonte
É isso que a maioria das pessoas quer, mas não recebeu votos suficientes !!!
S03 /
2
isso pode não funcionar com alguns milhões de arquivos em um diretório.
Dennis Nolte
3
Existem efeitos colaterais se o termo de pesquisa grep estiver no nome do arquivo.
Snorex
mywiki.wooledge.org/ParsingLs - uma abordagem melhor é provavelmente imprimir a data de criação em formato legível por máquina, talvez com statse você não tiver find -printf.
Tripleee
12

Você não pode. A opção -c informa quando as permissões foram alteradas pela última vez, -a testa o tempo de acesso mais recente e -m testa o tempo de modificação. O sistema de arquivos usado pela maioria dos tipos de Linux (ext3) não suporta um registro de "tempo de criação". Desculpe!

Max Cantor
fonte
7
De fato, não é apenas o tipo de sistema de arquivos - não há interface do sistema para obter essas informações, mesmo que o sistema de arquivos as contenha. Uma das deficiências do Unix remonta aos primeiros dias, e é por isso que o Unix nunca decola.
chrisdowney
1
Unix nunca vai decolar?
Lucid_dreamer 28/10/19
8

@ Max: está certo sobre o momento da criação.

No entanto, se você quiser calcular o argumento dias decorrido para um dos -atime, -ctime, -mtimeparâmetros, você pode usar a seguinte expressão

ELAPSED_DAYS=$(( ( $(date +%s) - $(date -d '2008-09-24' +%s) ) / 60 / 60 / 24 - 1 ))

Substitua "2008-09-24" pela data desejada e ELAPSED_DAYS será definido como o número de dias entre então e hoje. (Atualização: subtraia uma do resultado para alinhar com findo arredondamento da data.)

Portanto, para encontrar qualquer arquivo modificado em 24 de setembro de 2008, o comando seria:

find . -type f -mtime $(( ( $(date +%s) - $(date -d '2008-09-24' +%s) ) / 60 / 60 / 24 - 1 ))

Isso funcionará se a sua versão do findnão suportar os -newerXYpredicados mencionados na resposta do @Arve :.

yukondude
fonte
2

Com as opções -atime, -ctime e -mtime para encontrar, você pode se aproximar do que deseja alcançar.

ayaz
fonte
-3
cp `ls -ltr | grep 'Jun 14' | perl -wne 's/^.*\s+(\S+)$/$1/; print $1 . "\n";'` /some_destination_dir
Tintim
fonte
1
Por que você está copiando os arquivos? Além do comando em `ls ...`obras, ele não utiliza a findferramenta.
Yamaneko
-5

Encontrei este scriplet em um script que exclui todos os arquivos com mais de 14 dias:

CNT=0
for i in $(find -type f -ctime +14); do
  ((CNT = CNT + 1))
  echo -n "." >> $PROGRESS
  rm -f $i
done
echo deleted $CNT files, done at $(date "+%H:%M:%S") >> $LOG

Eu acho que um pouco mais de "man find" e procurar os parâmetros -ctime / -atime etc. ajudarão você aqui.

Georgi
fonte