Comment afficher l'heure modifiée d'un fichier?

35

Je voudrais une méthode pour trouver et imprimer l'heure modifiée d'un fichier, pour une utilisation dans un script bash.

Je suis venu avec:

ls -l $filename | cut -d ' ' -f '6-8'

Quelles sorties:

Jul 26 15:05

Bien que j'aimerais éviter l'analyse syntaxique ls, il serait également utile d'avoir l'année en cours.

Idéalement, j'aimerais voir une sortie similaire à la sortie par défaut de la datecommande.

Tue Jul 26 15:20:59 BST 2016

Quelles autres méthodes utiles sont disponibles?

Arronique
la source

Réponses:

46

Ne l'utilisez pas ls, c'est un travail pour stat:

stat -c '%y' filename

-cnous permet d'obtenir une sortie spécifique, nous %yobtiendrez ici la dernière heure de modification du fichier dans un format lisible par l'homme. Pour obtenir le temps en secondes depuis Epoch, utilisez %Y:

stat -c '%Y' filename

Si vous voulez aussi le nom du fichier, utilisez %n:

stat -c '%y : %n' filename
stat -c '%Y : %n' filename

Définissez les spécificateurs de format en fonction de vos besoins. Vérifiez man stat.

Exemple:

% stat -c '%y' foobar.txt
2016-07-26 12:15:16.897284828 +0600

% stat -c '%Y' foobar.txt
1469513716

% stat -c '%y : %n' foobar.txt
2016-07-26 12:15:16.897284828 +0600 : foobar.txt    

% stat -c '%Y : %n' foobar.txt
1469513716 : foobar.txt

Si vous voulez que la sortie soit comme Tue Jul 26 15:20:59 BST 2016, utilisez le temps de l'époque comme entrée pour date:

% date -d "@$(stat -c '%Y' a.out)" '+%a %b %d %T %Z %Y'
Tue Jul 26 12:15:21 BDT 2016

% date -d "@$(stat -c '%Y' a.out)" '+%c'               
Tue 26 Jul 2016 12:15:21 PM BDT

% date -d "@$(stat -c '%Y' a.out)"
Tue Jul 26 12:15:21 BDT 2016

Vérifiez dateles spécificateurs de format pour répondre à vos besoins. Voir man dateaussi

Heemayl
la source
5
En plus de cette réponse, n'oubliez pas que cette lsméthode est implémentée de manière incohérente dans tous les systèmes et ne doit donc jamais être utilisée pour une automatisation quelconque. À la place, utilisez des commandes telles que statet findlors de l’écriture de scripts.
Paddy Landau
1
excellent. Je n'avais pas entendu parler de ce petit trésor. Beaucoup d’entre eux dans l’environnement * nix / linux n’ont pas encore été découverts.
Ken Ingram le
1

j'ai essayé

ls -l $filename | cut -d ' ' -f '6-8'

mais si la date est inférieure à 10, le temps manque. Ceci à cause de l'espace supplémentaire avant la date s'il est inférieur à 10. Essayez ceci:

filename="test.txt"
ls -l $filename | awk -F ' ' '{print $6" "$7" "$8}'

La commande awk imprime les champs séparés par tous les espaces (-F ''). Esperons que ça marche. Je sais que cela ne répond pas à la question initiale, mais simplement une clarification de la commande ls pour la date et l'heure. Lorsque vous recherchez "ubuntu obtenir la date et l'heure du fichier" sur Google, cette question est listée en haut de la page, ce que je cherchais, car je n'ai pas besoin de l'année également. Pour l'année, la date et l'heure, vous pouvez essayer l'une des commandes ci-dessous. % m affiche le numéro du mois. % b affiche l'abréviation du mois: Supprimez le% H:% M si vous n'avez pas besoin des heures et des minutes. % -d n'imprime pas le zéro non significatif pour le jour du mois.

date -r $filename +"%Y %m %-d %H:%M"
date -r $filename +"%y %m %-d %H:%M"
date -r $filename +"%Y %b %-d %H:%M"
date -r $filename +"%y %b %-d %H:%M"
te7
la source