¿Cómo mostrar la hora modificada de un archivo?

35

Me gustaría un método para encontrar e imprimir la hora modificada de un archivo, para usar dentro de un script bash.

Se me ocurrió:

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

Qué salidas:

Jul 26 15:05

Aunque me gustaría evitar el análisis ls, también sería útil tener el año allí.

Idealmente, me gustaría ver una salida similar a la salida predeterminada del datecomando.

Tue Jul 26 15:20:59 BST 2016

¿Qué otros métodos útiles están disponibles?

Arronico
fuente

Respuestas:

46

No lo use ls, este es un trabajo para stat:

stat -c '%y' filename

-cnos permite obtener resultados específicos, aquí %yobtendremos la última hora de modificación del archivo en formato legible para humanos. Para obtener tiempo en segundos desde el uso de Epoch %Y:

stat -c '%Y' filename

Si también desea el nombre del archivo, use %n:

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

Establezca los especificadores de formato para satisfacer sus necesidades. Compruebe man stat.

Ejemplo:

% 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

Si desea un resultado similar Tue Jul 26 15:20:59 BST 2016, use el tiempo de Epoch 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 datelos especificadores de formato para satisfacer sus necesidades. Mira man datetambién

heemayl
fuente
55
Además de esta respuesta, tenga en cuenta que lsse implementa de manera inconsistente en todos los sistemas y, por lo tanto, nunca debe usarse para ningún tipo de automatización. En su lugar, use comandos como staty findcuando escriba scripts.
Paddy Landau
1
excelente. No sabía sobre este pequeño tesoro. Muchos de ellos en el entorno * nix / linux aún no se han descubierto.
Ken Ingram
1

Lo intenté

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

pero si la fecha es inferior a 10, pierde el tiempo. Esto debido al espacio adicional antes de la fecha si es menor que 10. Pruebe esto:

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

El comando awk imprime los campos separados por todos los espacios (-F ''). Espero que funcione. Sé que esto no responde a la pregunta original, sino solo una aclaración sobre el comando ls solo para la fecha y la hora. Cuando Google "ubuntu obtiene la fecha y la hora del archivo", enumera esta pregunta en la parte superior, que es lo que estaba buscando, ya que no necesito el año también. Para año, fecha y hora, puede probar uno de los comandos a continuación. % m imprime el número del mes. % b imprime la abreviatura del mes: elimine% H:% M si no necesita la hora y los minutos. % -d no imprime el cero inicial para el día del mes.

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
fuente