Imprimer la date de dernière modification d’un fichier dans Bash

Je n’arrive pas à trouver comment imprimer la date d’un fichier. Je suis jusqu’ici capable d’imprimer tous les fichiers dans un répertoire, mais j’ai besoin d’imprimer les dates avec lui.

Je sais que je dois attacher un format de date avec l’écho de l’entrée, mais tout ce que je ne trouve pas le bon format.

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

Vous pouvez utiliser la commande stat

 stat -c %y "$entry" 

Plus d’informations

 % y heure de dernière modification, lisible par l'homme

La commande ‘date’ n’est-elle pas beaucoup plus simple? Pas besoin de awk, stat, etc.

 date -r  

Sous OS X, j’aime que ma date soit au format YYYY-MM-DD HH:MM dans la sortie du fichier.

Donc, pour spécifier un fichier, j’utiliserais:

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

Si je veux l’exécuter sur une série de fichiers, je peux faire quelque chose comme ceci:

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

Cet exemple imprimera la dernière fois que j’ai exécuté la commande sudo periodic daily weekly monthly en référence aux fichiers journaux.


Pour append les noms de fichiers sous chaque date, j’exécuterais les opérations suivantes:

 #!/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 sortie serait la suivante:

 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 

Malheureusement, je ne sais pas comment empêcher le saut de ligne et conserver le nom de fichier ajouté à la fin de la date sans append de lignes au script.


PS – J’utilise #!/usr/bin/env bash comme je suis un utilisateur Python par jour et que différentes versions de bash installées sur mon système au lieu de #!/bin/bash

En ajoutant à la réponse de @StevePenny, vous pourriez vouloir couper la partie qui n’est pas si lisible par l’homme:

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

Le meilleur correspond à date -r filename +"%Y-%m-%d %H:%M:%S

EDITED: s’avère que j’avais oublié les guillemets nécessaires pour $entry afin d’imprimer correctement et de ne pas donner l’erreur “no such file or directory”. Merci beaucoup pour votre aide!

Voici mon code 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 ssortingng after the date to make it look pretty echo $entry:$modDate 

Imprime comme ceci:

 /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 

Pour les sauts de ligne, j’ai édité votre code pour obtenir quelque chose sans sauts de ligne.

  #!/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 

Je voulais obtenir la date de modification d’un fichier au format YYYYMMDDHHMMSS . Voici comment je l’ai fait:

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

Explication. C’est la combinaison de ces commandes:

 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 le nom de fichier n’a pas d’espace:

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

Cela imprime comme le format suivant:

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

Si les noms de fichiers ont de l’espace (vous pouvez utiliser la commande suivante pour les noms de fichiers sans espaces, cela semble compliqué / laid que l’ancien):

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