Pregunta 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

75
2018-05-06 02:28


origen


Respuestas:


Puedes usar el stat mando

stat -c %y "$entry"

Más información

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

86
2018-05-06 02:30



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

date -r <filename>

130
2017-12-27 20:25



En OS X, me gusta que mi fecha esté en 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 sudo periodic daily weekly monthly comando como hace 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 - Yo uso #!/usr/bin/env bash ya que soy un usuario de Python por día y tengo diferentes versiones de bash instalado en mi sistema en lugar de #!/bin/bash


11
2018-05-01 07:21



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

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

5
2018-05-06 02:33



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


3
2018-04-18 06:07



EDITADO: resulta que había olvidado las cotizaciones necesarias para $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

2
2018-05-06 03:18



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

2
2018-05-13 08:35



Quería obtener la fecha de modificación de un archivo en YYYYMMDDHHMMSS formato. 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)

2
2017-08-30 08:44



Si el nombre del archivo no tiene espacios:

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

1
2018-05-06 02:51