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?

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).


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


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.


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

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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.