Como exibir a hora modificada de um arquivo?

35

Eu gostaria de um método para encontrar e imprimir o horário modificado de um arquivo, para uso em um script bash.

Eu inventei:

ls -l $filename | cut -d ' ' -f '6-8'

Quais saídas:

Jul 26 15:05

Embora eu gostaria de evitar a análise ls, também seria útil ter o ano lá.

Idealmente, eu gostaria de ver uma saída semelhante à saída padrão do datecomando.

Tue Jul 26 15:20:59 BST 2016

Que outros métodos úteis estão disponíveis?

Arronical
fonte

Respostas:

46

Não use ls, este é um trabalho para stat:

stat -c '%y' filename

-cnos permite obter uma saída específica, aqui %yvamos obter a última hora modificada do arquivo no formato legível por humanos. Para obter tempo em segundos desde o Epoch, use %Y:

stat -c '%Y' filename

Se você quiser o nome do arquivo também, use %n:

stat -c '%y : %n' filename
stat -c '%Y : %n' filename

Defina os especificadores de formato para atender às suas necessidades. Verifique man stat.

Exemplo:

% stat -c '%y' foobar.txt
2016-07-26 12:15:16.897284828 +0600

% stat -c '%Y' foobar.txt
1469513716

% stat -c '%y : %n' foobar.txt
2016-07-26 12:15:16.897284828 +0600 : foobar.txt    

% stat -c '%Y : %n' foobar.txt
1469513716 : foobar.txt

Se você deseja a saída Tue Jul 26 15:20:59 BST 2016, use o tempo da época como entrada para date:

% date -d "@$(stat -c '%Y' a.out)" '+%a %b %d %T %Z %Y'
Tue Jul 26 12:15:21 BDT 2016

% date -d "@$(stat -c '%Y' a.out)" '+%c'               
Tue 26 Jul 2016 12:15:21 PM BDT

% date -d "@$(stat -c '%Y' a.out)"
Tue Jul 26 12:15:21 BDT 2016

Verifique dateos especificadores de formato para atender às suas necessidades. Veja man datetambém.

heemail
fonte
5
Além dessa resposta, lembre-se de que lsé implementado de forma inconsistente nos sistemas e, portanto, nunca deve ser usado para qualquer tipo de automação. Em vez disso, use comandos como state findao escrever scripts.
Paddy Landau
1
excelente. Eu não sabia sobre esse pequeno tesouro. Muitos deles no ambiente * nix / linux ainda não foram descobertos.
Ken Ingram
1

eu tentei

ls -l $filename | cut -d ' ' -f '6-8'

mas se a data for menor que 10, ela perderá a hora. Isso devido ao espaço extra antes da data, se for menor que 10. Tente o seguinte:

filename="test.txt"
ls -l $filename | awk -F ' ' '{print $6" "$7" "$8}'

O comando awk imprime os campos separados por todos os espaços (-F ''). Espero que funcione. Sei que isso não responde à pergunta original, mas apenas um esclarecimento sobre o comando ls por apenas data e hora. Quando você "ubuntu obtém a data e a hora do arquivo" no Google, ele lista essa pergunta no topo, que é o que eu estava procurando, já que também não preciso do ano. Por ano, data e hora, você pode tentar um dos comandos abaixo. % m imprime o número do mês. % b imprime a abreviação do mês: elimine% H:% M se não precisar de horas e minutos. % -d não imprime zero à esquerda no dia do mês.

date -r $filename +"%Y %m %-d %H:%M"
date -r $filename +"%y %m %-d %H:%M"
date -r $filename +"%Y %b %-d %H:%M"
date -r $filename +"%y %b %-d %H:%M"
te7
fonte