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?

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.


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