Como descubro o arquivo acessado mais recentemente em um determinado diretório?
Posso usar o find
comando para listar todos os arquivos modificados/acessados nos últimos n
minutos. Mas aqui no meu caso, não tenho certeza de quando o último arquivo foi modificado/acessado? Tudo o que preciso é listar todos os arquivos que foram acessados/modificados muito recentemente entre todos os outros subarquivos ou subdiretórios, classificados por seus tempos de acesso/modificação, por exemplo.
Isso é possível?
Responder1
Para imprimir os 3 últimos arquivos acessados (ordenados do último arquivo acessado até o terceiro último arquivo acessado):
find . -type f -exec stat -c '%X %n' {} \; | sort -nr | cut -d' ' -f2- | awk 'NR==1,NR==3 {print}'
Para imprimir os últimos 3 arquivos modificados (classificados do último arquivo modificado até o terceiro último arquivo modificado):
find . -type f -exec stat -c '%Y %n' {} \; | sort -nr | cut -d' ' -f2- | awk 'NR==1,NR==3 {print}'
find . -type f -exec stat -c '%X %n' {} \;
: imprime o horário do último acesso seguido do caminho do arquivo para cada arquivo na hierarquia de diretórios atual;find . -type f -exec stat -c '%Y %n' {} \;
: imprime a hora da última modificação seguida do caminho do arquivo para cada arquivo na hierarquia de diretórios atual;sort -nr
: classifica em ordem numérica inversa;cut -d' ' -f2-
: imprime todos os campos separados por espaço a partir do segundo campo;awk 'NR==1,NR==3 {print}'
: imprime linhas no intervalo 1-3.
Você pode alterar o número de arquivos a serem exibidos alterando 3 para o número desejado de arquivos no formato awk 'NR==1,NR==3 {print}'
.
Esta resposta é baseada na versão GNU do stat
, portanto, os usuários em sistemas baseados em BSD terão que alterar a string de formato dos stat
comandos para que imprimam os carimbos de data e hora relevantes.
~ % touch file\ 1
~ % touch file\ 2
~ % touch file\ 3
~ % find . -type f -exec stat -c '%X %n' {} \; | sort -nr | cut -d' ' -f2- | awk 'NR==1,NR==3 {print}'
./file 3
./file 2
./file 1
~ % find . -type f -exec stat -c '%Y %n' {} \; | sort -nr | cut -d' ' -f2- | awk 'NR==1,NR==3 {print}'
./file 3
./file 2
./file 1
~ % cat file\ 1
~ % find . -type f -exec stat -c '%X %n' {} \; | sort -nr | cut -d' ' -f2- | awk 'NR==1,NR==3 {print}'
./file 1
./file 3
./file 2
~ % find . -type f -exec stat -c '%Y %n' {} \; | sort -nr | cut -d' ' -f2- | awk 'NR==1,NR==3 {print}'
./file 3
./file 2
./file 1
~ % touch file\ 2
~ % find . -type f -exec stat -c '%X %n' {} \; | sort -nr | cut -d' ' -f2- | awk 'NR==1,NR==3 {print}'
./file 2
./file 1
./file 3
~ % find . -type f -exec stat -c '%Y %n' {} \; | sort -nr | cut -d' ' -f2- | awk 'NR==1,NR==3 {print}'
./file 2
./file 3
./file 1
Responder2
Se você quiser que os arquivos em um determinado diretório sejam classificados por idade de modificação (os mais recentes primeiro):
ls -t
Para classificar por tempo de acesso, adicione a -u
opção.
ls -tu
No entanto, tome cuidado para queos sistemas Linux modernos não rastreiam tempos de acesso exatos por padrão. Portanto, os carimbos de data/hora de acesso podem não ser confiáveis.
Se você deseja encontrar o arquivo mais recente em uma árvore de diretórios, incluindo subdiretórios, o método mais fácil é usar o zsheliminatórias globais.
print -lr -- **/*(om)
Use oa
em vez de om
usar o tempo de acesso em vez do tempo de modificação. Você pode restringir as correspondências, por exemplo, para obter os 10 arquivos mais recentes:
print -lr -- **/*(om[1,10])
Esses ignoram arquivos ocultos. Se você quiser considerar também os arquivos ocultos, adicione o D
qualificador glob. Você também pode adicionar o .
qualificador glob para considerar apenasregulararquivos (não considera links simbólicos, diretórios, fifos...), e mm-60
ou mh-1
restringir a arquivos modificados pela última vez na última hora.
Responder3
Você pode usar a opção recursiva ( -R
) junto ls
com a opção de classificação por tempo ( -t
) e a opção de classificação reversa ( -r
) para listar todos os arquivos em uma árvore de diretórios. Isso não classificará todos os arquivos por datas de acesso/modificação nos subdiretórios, mas os classificará por essa data em cada subdiretório de forma independente.
Usando um comando como este: ls -ltrR <sometopdir>
.
Exemplo
$ ls -ltrR .
total 759720
-rw-r-----@ 1 sammingolelli staff 2514441 Mar 31 2015 restfulapi-120704053212-phpapp01.pdf
-rw-r-----@ 1 sammingolelli staff 567808 Apr 7 2015 USGCB-Windows-Settings.xls
-rw-r-----@ 1 sammingolelli staff 180736 Apr 7 2015 USGCB-RHEL5-Desktop-Settings-Version-1.2.5.0.xls
-rw-r-----@ 1 sammingolelli staff 6474 Apr 8 2015 tap_kp_mavericks.txt
./kerberos:
total 5464
-rw-r-----@ 1 sammingolelli staff 37317 Oct 2 13:03 Set_up_Kerberos_instruction_d8.docx
-rw-r-----@ 1 sammingolelli staff 2753195 Oct 13 13:49 Keberos configuration with AD 01_09_2014.pdf
./homestarrunner:
total 10624
-rw-rw-rw-@ 1 sammingolelli staff 319422 May 10 2000 error_hs.wav
-rw-rw-rw-@ 1 sammingolelli staff 53499 Jun 8 2001 sb_duck.mp3
-rw-rw-rw-@ 1 sammingolelli staff 199254 Mar 11 2002 email_sb.wav
-rw-rw-rw-@ 1 sammingolelli staff 39288 Mar 25 2002 bubs_dontutalk.mp3
-rw-rw-rw-@ 1 sammingolelli staff 75432 May 6 2002 trash_sb.wav
-rw-rw-rw-@ 1 sammingolelli staff 298946 Dec 1 2002 error_sb.wav
-rw-rw-rw-@ 1 sammingolelli staff 298686 Dec 1 2002 startup_hs.wav
-rw-rw-rw-@ 1 sammingolelli staff 90279 Dec 1 2002 sb_meedlymee.mp3
-rw-rw-rw-@ 1 sammingolelli staff 73561 Dec 1 2002 sb_dubdeuce.mp3
-rw-rw-rw-@ 1 sammingolelli staff 193097 Dec 1 2002 sb_pizza.mp3
-rw-rw-rw-@ 1 sammingolelli staff 30093 Dec 1 2002 sb_stiny.mp3
-rw-rw-rw-@ 1 sammingolelli staff 61858 Dec 1 2002 ss_sadflying.mp3
-rw-rw-rw-@ 1 sammingolelli staff 150142 Dec 1 2002 email_hs.wav
-rw-rw-rw-@ 1 sammingolelli staff 68545 Dec 1 2002 bubs_grabbinbutt.mp3
-rw-rw-rw-@ 1 sammingolelli staff 61022 Dec 1 2002 cz_jeorghb.mp3
-rw-rw-rw-@ 1 sammingolelli staff 40124 Dec 1 2002 marzy_nasty.mp3
-rw-rw-rw-@ 1 sammingolelli staff 224116 Dec 1 2002 shutdown_sb.wav
-rw-rw-rw-@ 1 sammingolelli staff 260546 Dec 1 2002 shutdown_hs.wav
-rw-rw-rw-@ 1 sammingolelli staff 57686 Dec 1 2002 trash_hs.wav
Responder4
Você deseja classificar o conjunto completo de arquivos "recentes" pelo horário de acesso/modificação, independentemente de sua localização na árvore de arquivos?
Uma maneira de fazer isso é imprimir stat
o horário de modificação de cada arquivo, sort
pelo resultado, e depois cut
o horário de modificação a partir dos resultados.
Isso será interrompido para arquivos que contenham novas linhas em seus nomes, mas para outros arquivos, aqui está uma solução que listará os arquivos modificados nos últimos 60 minutos, ordenados do mais recente para o menos modificado:
find . -type f -mmin -60 -exec stat -c $'%Y\t%n' {} + | sort -nr | cut -f2-