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")}'