bash - recientes - ultimo archivo modificado linux
Imprima la última fecha de modificación de un archivo en Bash (9)
¿No es mucho más simple el comando ''fecha''? No hay necesidad de awk, stat, etc.
date -r <filename>
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
Agregando a @StevePenny respuesta, es posible que desee cortar la parte no tan humanamente legible:
stat -c%y Localizable.strings | cut -d''.'' -f1
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
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
Lo mejor es la date -r filename +"%Y-%m-%d %H:%M:%S
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
Puedes usar el comando stat
stat -c %y "$entry"
Más información
%y time of last modification, human-readable
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 <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")}''