Listar todos os arquivos alterados recentemente (recursivos)

20

Então, eu quero exibir (por lsexemplo) todos os arquivos que foram alterados nos últimos sete dias. Se eu estiver na minha pasta docroot, ele poderá parecer "mais profundo".

Por exemplo:

File        Last changed
docroot
|- myfile1  30.11.2015
|- myfile2  10.11.2015
|- MySub
   |-sub1   30.11.2015
   |-sub2   10.11.2015

Portanto, o ls(ou o que couber) deve gerar myfile1e (se possível) MySub/sub1.

Isso é possível com um comando?

DasSaffe
fonte

Respostas:

38

Claro. No diretório em que você está:

find . -type f -mtime -7 -exec ls -l {} \; 

Adicione um redirecionamento a ele (também conhecido > results.txtpor armazená-los nesse arquivo).

  • type f faz apenas arquivos e não diretórios
  • mtime -7 faz 7 dias atrás até agora (+7 seria 'mais de 7 dias')
  • e depois o alimenta lspara mostrar uma lista longa

Você pode jogar com o ls -lpapel também:

find . -type f -mtime -7 -exec ls -Rl --time-style=long-iso {} \; 
find . -type f -mtime -7 -exec ls -R  --time-style=long-iso {} \; 

mostrará um método do tipo árvore com diretórios entre os arquivos na lista longa (1) ou na lista curta (2).

Rinzwind
fonte
4
findtem lsopção para que você poderia apenas fazerfind . -type f -mtime -7 -ls
heemayl
Claro, mas isso faz com que seja um pouco mais genérico (I utilizar este método para encontrar arquivos eu preciso -remove- e pode mudar esse comando para fazê-lo :))
Rinzwind
3
Também é mais apropriado usar o find ... -exec ls -l {} +que executa com ls -lmuito mais eficiência - menos vezes com vários parâmetros. Esta é uma opção padrão findespecificada pelo POSIX.
Pabouk
5

Com zsh:

ls -l **/*(.m-7)
  • **/* procurará arquivos recursivamente a partir do diretório atual

  • (.m-7)é qualificador global em que .indica arquivo normal, m-7indica arquivos que foram modificados nos últimos 7 dias

heemail
fonte
2

O comando a seguir funciona um sonho no Mac OSX - talvez também no ubuntu…

find . -type f -mtime -7 -exec stat -lt "%Y-%m-%d %H:%M:%S" {} \; | cut -d\  -f6- | sort -r

Ele localiza arquivos na árvore de diretórios atual que foram modificados nos últimos 7 dias, produz a data de modificação + hora e caminho, classificados primeiro pela última vez.

Exemplo de saída:

2018-02-21 22:06:30 ./fmxmlsnippet.xml
2018-02-19 12:56:01 ./diff.html
2018-02-19 12:44:37 ./temp/iDDR/XMSC_fmxmlsnippet.xml
2018-02-18 22:04:05 ./temp/iDDR/XMFD_fmxmlsnippet.xml
2018-02-15 10:18:27 ./xml/iDDR/XML2_fmxmlsnippet.xml
2018-02-15 10:13:29 ./xsl/fmxmlsnippet/XML2_fmCM_AnalyseLayout.xsl
2018-02-15 10:11:36 ./xsl/.DS_Store
2018-02-15 10:10:51 ./xsl/_inc/inc.XML2_fmCM_ReportReferencesToExternalFiles.xsl
2018-02-15 10:10:09 ./xsl/_inc/.DS_Store
2018-02-15 10:07:35 ./xsl/fmxmlsnippet/XML2_fmCM_AnalyseLayout-NoAnchors.xsl
2018-02-15 10:07:35 ./xsl/_inc/inc.XML2_fmCM_AnalyseLayout.xsl

Eu ficaria grato por qualquer feedback dos usuários do Ubuntu.

MrWatson
fonte
A única solução que funcionou bem para mim no Mac. Obrigado!
artnikpro
De nada @artnikpro!
MrWatson
1

Não é exatamente o que foi pedido ... mas muito mais fácil de lembrar ...

ls -alRt docroot

ou

ls -alRt /path/to/top/level/directory
heynnema
fonte
0

7 dias que são 60 segundos * 60 minutos * 24 horas * 7 dias = 604800 segundos

Descubra a data atual em segundos (hora da época do Unix):

$ date +%s
1448876323

Subtraia os 7 dias em segundos:

expr $(date +%s) - 604800
1448271548

Agora assuma o statcomando e imprima as estatísticas de todos os arquivos no formato "nome + tempo em segundos" e use awkpara cortar os arquivos cuja hora de modificação é maior que a data que calculamos

$ stat --printf="%n %Y\n" $HOME/* | awk '$2 > 1448271265 {print $0}'
/home/xieerqi/1448428697574.png 1448429613
/home/xieerqi/1448763343273.png 1448763478
/home/xieerqi/1510DRIVE 1448352453
/home/xieerqi/addRemoveDistribution 1448666843
/home/xieerqi/add-update.awk 1448716356
/home/xieerqi/add-update.sh 1448625092

Particularmente interessantes são os três últimos arquivos, porque sei que os estava trabalhando há menos de sete dias. Então eu sei que funciona

Sergiy Kolodyazhnyy
fonte
2
Observe que, em vez de awk '$2 > 1448271265 {print $0}'você pode dizer diretamente awk '$2 > 1448271265'. Em uma condição verdadeira, o awk imprime a linha atual como uma ação padrão.
Fedorqui