web-dev-qa-db-fra.com

sous Linux, comment puis-je afficher la date de dernière modification du dossier, en tenant compte de son contenu?

Alors voici l'affaire. Disons que j'ai un répertoire nommé "web", donc

$ ls -la

drwx------  4 rimmer rimmer 4096 2010-11-18 06:02 web

MAIS dans ce répertoire, web/php /

$ ls -la

-rw-r--r-- 1 rimmer rimmer 1957 2011-01-05 08:44 index.php

Cela signifie que même si le contenu de mon répertoire, /web/php/index.php, a été modifié pour la dernière fois le 2011-01-05, le répertoire/web/lui-même est signalé comme ayant été modifié pour la dernière fois le 2010-11-18.

Ce que je dois faire, c'est que la date de dernière modification de mon répertoire/web/soit indiquée comme la dernière date de modification de tout fichier/répertoire de ce répertoire, de manière récursive.

Comment puis-je faire cela?

58
Richard Rodriguez

Quelque chose comme:

find /path/ -type f -exec stat \{} --printf="%y\n" \; | 
     sort -n -r | 
     head -n 1

Explication:

  • la commande find imprimera l'heure de modification pour chaque fichier ignorant récursivement les répertoires (selon le commentaire d'IQAndreas, vous ne pouvez pas vous fier aux horodatages des dossiers)
  • trier -n (numériquement) -r (inverse)
  • head -n 1: obtient la première entrée
50
Paulo Scardine

Si vous avez une version de find (telle que GNU find) qui prend en charge -printf, Il n'est pas nécessaire d'appeler stat à plusieurs reprises:

find /some/dir -printf "%T+\n" | sort -nr | head -n 1

ou

find /some/dir -printf "%TY-%Tm-%Td %TT\n" | sort -nr | head -n 1

Si vous n'avez pas besoin de récursivité, cependant:

stat --printf="%y\n" *
19
Dennis Williamson

Si je pouvais, je voterais pour la réponse de Paulo. Je l'ai testé et compris le concept. Je peux confirmer que ça marche. La commande find peut générer de nombreux paramètres. Par exemple, ajoutez ce qui suit au --printf clause:

%a for attributes in the octal format
%n for the file name including a complete path

Exemple:

find Desktop/ -exec stat \{} --printf="%y %n\n" \; | sort -n -r | head -1
2011-02-14 22:57:39.000000000 +0100 Desktop/new file

Permettez-moi de poser cette question également: l'auteur de cette question veut-il résoudre son problème en utilisant Bash ou PHP? Cela devrait être précisé.

6
Martian