Obtém a hora da última modificação do arquivo

0

Eu quero extrair o trecho Jul 22 da saída:

-rw-rw-r-- 1 douglas douglas  92188 Jul 22 08:47 master-terfron-21-07.log

Esta é a saída do comando:

ls -l *.log

Como eu usaria uma expressão regular para obter a parte necessária?

    
por Douglas 23.07.2015 / 14:01

3 respostas

5

Como você deseja apenas o horário da última modificação (mês e data) dos arquivos .log no diretório atual, basta usar a opção -r de date . Não há necessidade de qualquer regex ou outros comandos supérfluos.

Você pode usar este shell de uma linha:

for i in *.log; do echo "$i: $(date '+%b-%d' -r "$i")"; done

Por exemplo, estou encontrando o mês e a data da última modificação de todos os arquivos .txt no diretório atual:

$ for i in *.txt; do echo "$i: $(date '+%b-%d' -r "$i")"; done
file.txt: Feb-12
new.txt: Jul-23

O principal comando envolvido aqui é:

date '+%b-%d' -r file.txt

$ date '+%b-%d' -r file.txt 
Feb-12

Se você quiser fazer a operação recursivamente, use find :

find . -type f -name '*.txt' -printf '%p: ' -exec date '+%b-%d' -r {} \;

Exemplo:

$ find . -type f -name '*.txt' -printf '%p: ' -exec date '+%b-%d' -r {} \;
./foo/list.txt: Jul-16
./new.txt: Jul-15
./file.txt: Jul-23

EDITAR:

Para responder ao original regex way:

$ ls -l *.txt | grep -Po '.*[[:digit:]]+ \K[[:alpha:]]{3} [[:digit:]]{2}'
Jul 23
Jul 15
  • grep -Po indica que usaremos o PCRE e obteremos apenas a parte correspondente

  • .*[[:digit:]]+ corresponde à parte desejada e \K descarta a correspondência

  • [[:alpha:]]{3} [[:digit:]]{2} corresponde a três caracteres alfabéticos (mês) seguidos por um espaço e dois dígitos (data).

por heemayl 23.07.2015 / 14:29
2

Para obter a data da última modificação do seu arquivo, você pode usar:

$ stat -c '%n: %y' *.log
alternatives.log: 2015-07-20 09:28:52.727063510 +0200
apport.log: 2015-07-23 09:32:58.282590564 +0200

Consulte a página do manual stat para mais opções.

    
por Sylvain Pineau 23.07.2015 / 16:36
0

Uma solução mais simples para usar ls com cut :

ls -l filename | cut -f 6,7 -d' '

exemplo:

$ touch file
$ ls -l file | cut -f 6,7 -d' '
Jul 23

Outra solução:

 ls -l filename |awk {'print $9" was last modified   "$6" "$7'}
    
por Maythux 23.07.2015 / 16:25