GNU/Linux >> Tutoriels Linux >  >> Linux

Comment puis-je trouver le fichier le plus ancien dans une arborescence de répertoires

Cela fonctionne (mis à jour pour intégrer la suggestion de Daniel Andersson) :

find -type f -printf '%T+ %p\n' | sort | head -n 1

Celui-ci est un peu plus portable et parce qu'il ne repose pas sur le GNU find poste -printf , donc ça marche aussi sur BSD / OS X :

find . -type f -print0 | xargs -0 ls -ltr | head -n 1

Le seul inconvénient ici est qu'il est quelque peu limité à la taille de ARG_MAX (ce qui devrait n'est pas pertinent pour la plupart des nouveaux noyaux). Donc, s'il y a plus de getconf ARG_MAX caractères retournés (262 144 sur mon système), cela ne vous donne pas le bon résultat. Il n'est pas non plus conforme à POSIX car -print0 et xargs -0 n'est pas.

D'autres solutions à ce problème sont décrites ici :Comment puis-je trouver le dernier fichier (le plus récent, le plus ancien, le plus ancien) dans un répertoire ? – Wiki de Greg


Les commandes suivantes sont garanties pour fonctionner avec tout type de noms de fichiers étranges :

find -type f -printf "%T+ %p\0" | sort -z | grep -zom 1 ".*" | cat

find -type f -printf "%[email protected] %T+ %p\0" | \
    sort -nz | grep -zom 1 ".*" | sed 's/[^ ]* //'

stat -c "%y %n" "$(find -type f -printf "%[email protected] %p\0" | \
    sort -nz | grep -zom 1 ".*" | sed 's/[^ ]* //')"

Utilisation d'un octet nul (\0 ) au lieu d'un saut de ligne (\n ) garantit que la sortie de find sera toujours compréhensible si l'un des noms de fichier contient un caractère de saut de ligne.

Le -z switch fait que sort et grep interprètent uniquement les octets nuls comme des caractères de fin de ligne. Puisqu'il n'y a pas de commutateur de ce type pour la tête, nous utilisons grep -m 1 à la place (une seule occurrence).

Les commandes sont classées par temps d'exécution (mesuré sur ma machine).

  • La première commande sera la plus lente car elle doit d'abord convertir le mtime de chaque fichier dans un format lisible par l'homme, puis trier ces chaînes. La canalisation vers le chat évite de colorer la sortie.

  • La deuxième commande est légèrement plus rapide. Pendant qu'il effectue toujours la conversion de date, le tri numérique (sort -n ) les secondes écoulées depuis l'époque Unix sont un peu plus rapides. sed supprime les secondes depuis l'époque Unix.

  • La dernière commande n'effectue aucune conversion et devrait être nettement plus rapide que les deux premières. La commande find elle-même n'affichera pas le mtime du fichier le plus ancien, donc stat est nécessaire.

Pages de manuel associées :find – grep – sed – sort – stat


Linux
  1. Comment puis-je créer un fichier dans chaque dossier ?

  2. Comment puis-je exécuter dos2unix sur un répertoire entier ?

  3. Comment obtenir le répertoire absolu d'un fichier dans bash ?

  4. Comment puis-je trouver un fichier/répertoire qui pourrait se trouver n'importe où sur la ligne de commande Linux ?

  5. Comment puis-je éditer tous les fichiers renvoyés par find in vi sous Linux ?

Comment trouver la taille totale d'un répertoire sous Linux

Comment puis-je trouver l'emplacement MySQL my.cnf

Comment puis-je copier récursivement des fichiers par extension de fichier, en préservant la structure des répertoires ?

Comment puis-je supprimer un fichier ou un répertoire nommé \ ?

Comment copier une arborescence de répertoires mais pas les fichiers sous Linux ?

Vous ne trouvez pas .so dans le même répertoire que l'exécutable ?