Imprima la última fecha de modificación de un archivo en Bash

Parece que no puedo encontrar cómo imprimir la fecha de un archivo. Hasta ahora puedo imprimir todos los archivos en un directorio, pero necesito imprimir las fechas con él.

Sé que necesito adjuntar un formato de fecha con el eco de la entrada, pero no puedo encontrar el formato correcto.

echo "Please type in the directory you want all the files to be listed" read directory for entry in "$directory"/* do echo "$entry" done 

Puedes usar el comando stat

 stat -c %y "$entry" 

Más información

 % y tiempo de la última modificación, legible por humanos

¿No es mucho más simple el comando ‘fecha’? No hay necesidad de awk, stat, etc.

 date -r  

En OS X, me gusta que mi fecha tenga el formato de YYYY-MM-DD HH:MM en la salida del archivo.

Entonces para especificar un archivo que usaría:

 stat -f "%Sm" -t "%Y-%m-%d %H:%M" [filename] 

Si quiero ejecutarlo en un rango de archivos, puedo hacer algo como esto:

 #!/usr/bin/env bash for i in /var/log/*.out; do stat -f "%Sm" -t "%Y-%m-%d %H:%M" "$i" done 

Este ejemplo se imprimirá la última vez que ejecuté el comando sudo periodic daily weekly monthly al hacer referencia a los archivos de registro.


Para agregar los nombres de archivo debajo de cada fecha, ejecutaría lo siguiente en su lugar:

 #!/usr/bin/env bash for i in /var/log/*.out; do stat -f "%Sm" -t "%Y-%m-%d %H:%M" "$i" echo "$i" done 

La salida sería la siguiente:

 2016-40-01 16:40 /var/log/daily.out 2016-40-01 16:40 /var/log/monthly.out 2016-40-01 16:40 /var/log/weekly.out 

Lamentablemente, no estoy seguro de cómo evitar el salto de línea y mantener el nombre del archivo adjunto al final de la fecha sin agregar más líneas al script.


PD: uso #!/usr/bin/env bash ya que soy un usuario de Python por día, y tengo instaladas diferentes versiones de bash en mi sistema en lugar de #!/bin/bash

Agregando a @StevePenny respuesta, es posible que desee cortar la parte no tan humanamente legible:

 stat -c%y Localizable.strings | cut -d'.' -f1 

Lo mejor es la date -r filename +"%Y-%m-%d %H:%M:%S

EDITADO: Resulta que había olvidado las comillas necesarias para la $entry para imprimir correctamente y no dar el error “no hay tal archivo o directorio”. ¡Muchas gracias a todos por ayudarme!

Aquí está mi código final:

  echo "Please type in the directory you want all the files to be listed with last modified dates" #bash can't find file creation dates read directory for entry in "$directory"/* do modDate=$(stat -c %y "$entry") #%y = last modified. Qoutes are needed otherwise spaces in file name with give error of "no such file" modDate=${modDate%% *} #%% takes off everything off the string after the date to make it look pretty echo $entry:$modDate 

Se imprime así:

 /home/joanne/Dropbox/cheat sheet.docx:2012-03-14 /home/joanne/Dropbox/Comp:2013-05-05 /home/joanne/Dropbox/Comp 150 java.zip:2013-02-11 /home/joanne/Dropbox/Comp 151 Java 2.zip:2013-02-11 /home/joanne/Dropbox/Comp 162 Assembly Language.zip:2013-02-11 /home/joanne/Dropbox/Comp 262 Comp Architecture.zip:2012-12-12 /home/joanne/Dropbox/Comp 345 Image Processing.zip:2013-02-11 /home/joanne/Dropbox/Comp 362 Operating Systems:2013-05-05 /home/joanne/Dropbox/Comp 447 Societal Issues.zip:2013-02-11 

Para los saltos de línea edité su código para obtener algo sin saltos de línea.

  #!/bin/bash for i in /Users/anthonykiggundu/Sites/rku-it/*; do t=$(stat -f "%Sm" -t "%Y-%m-%d %H:%M" "$i") echo $t : "${i##*/}" # t only contains date last modified, then only filename 'grokked'- else $i alone is abs. path done 

Quería obtener la fecha de modificación de un archivo en formato YYYYMMDDHHMMSS . Así es como lo hice:

 date -d @$( stat -c %Y myfile.css ) +%Y%m%d%H%M%S 

Explicación. Es la combinación de estos comandos:

 stat -c %Y myfile.css # Get the modification date as a timestamp date -d @1503989421 +%Y%m%d%H%M%S # Convert the date (from timestamp) 

Si el nombre del archivo no tiene espacios:

 ls -l  | awk '{print $6, " ", $7, " ", $8, " ", $9 }' 

Esto se imprime como el siguiente formato:

  Dec 21 20:03 a1.out Dec 21 20:04 a.cpp 

Si los nombres de archivo tienen espacio (puede usar el siguiente comando para nombres de archivos sin espacios, simplemente se ve complicado / feo que el anterior):

  ls -l  | awk '{printf ("%s %s %s ", $6, $7, $8); for (i=9; i< =NF; i++){ printf ("%s ", $i)}; printf ("\n")}'