Vous souhaitez trier les fichiers par date de mise à jour, y compris les sous-répertoires


17

Je souhaite trier uniquement les fichiers par date de mise à jour, y compris les sous-répertoires.

J'ai découvert ls -lrtR | grep ^-. mais il ne semble pas trier par date de mise à jour.

Et je dois enregistrer cette liste dans un fichier. C'est possible?

Apr 01 2010  InsideDoosanServiceImpl.class  // in A directory
Apr 08 2010  MainController.class  // in B directory
Apr 07 2010  RecommendController.class  // in B directory
Apr 01 2010  MainDao.class  // in B directory

Je veux dire que la liste entière n'est pas classée par date, mais d'abord classée par dossier et classée par date.

Je veux une liste d'abord triée par date incluant tous les sous-répertoires.

Réponses:


12

Je ne sais pas exactement de quoi vous parlez update dates, mais vous utilisez l' -roption qui, selon l'homme, fait cela -

-r Inverse l'ordre du tri pour obtenir l'ordre lexicographique inverse ou les entrées les plus anciennes en premier (ou les fichiers les plus gros en dernier, si combinés avec le tri par taille

Je pense que cela devrait être assez bon pour vous si vous avez besoin de fichiers triés par heure.

ls -lRt

Si vous n'avez pas besoin de tous les autres éléments répertoriés par lsalors vous pouvez utiliser -

ls -1Rt

Pour capturer le résultat dans un fichier, vous pouvez utiliser l'opérateur de redirection >et donner un nom de fichier. Vous pouvez donc faire quelque chose comme ça -

ls -lRt > sortedfile.list

Mise à jour:

find . -type f -exec ls -lt {} +

Je veux dire la dernière fois qu'un fichier a été modifié :)

Le résultat du tri est trié par dossier et par date. Je veux trier par date et par dossier .. est-ce possible?

Désolé, pouvez-vous s'il vous plaît me montrer une sortie? Je n'ai pas tout à fait suivi le tri des dossiers si vous l'avez utilisé ls -lrt.
jaypal singh

// Jaypal Singh, j'ai mis à jour ma sortie à ma question ↑ :). J'espère vraiment que vous le comprenez et désolé pour mon mauvais anglais.

1
Cela échoue si la liste de fichiers est suffisamment longue pour forcer xargsà effectuer plusieurs appels à ls, car les fichiers ne sont correctement triés qu'à chaque lsappel mais manquent d'un ordre global cohérent dans la sortie.
Brandon Rhodes

19

Avec ls, -R recursera les répertoires et -t triera par modification. Cependant, il parcourt récursivement les répertoires et applique -t à chaque répertoire. Il n'accumule pas tous les fichiers de tous les répertoires, puis les trie. (Pour autant que je comprends, ce dernier est ce que vous voulez)

Avec gnu find (1), vous pouvez spécifier le format de sortie pour inclure le nombre de secondes depuis epoch et le nom de fichier, puis vous pouvez le diriger vers sort (1).

find . -type f -printf "%T@ %f\n" | sort -n > out.txt

Oui, GNU findça aide. Mais OP fonctionne sur des AIXmachines et GNU findn'était donc pas disponible pour lui.
jaypal singh

Il est dommage de lsne pas pouvoir accumuler des fichiers avant de les trier. lsest si rapide par rapport à find.
Nathan ReinstateMonica Arthur

lset findlit les mêmes données, donc je ne peux imaginer aucune raison pour laquelle ls devrait être considérablement plus rapide que find. Sur mon système, la recherche est 5 fois plus rapide (recherche dans environ un demi-million de fichiers)
Rolf Rander

7
Vous voudrez peut-être une date / heure complète et non seulement le nom du fichier mais aussi le chemin dans la sortie, dans ce cas, modifiez la chaîne de formatage: en find . -type f -printf "%T@ %Tc %p\n" | sort -n > out.txtdonnant des entrées de sortie comme 1427913836.2330520210 wed 1 apr 2015 20:43:56 ./subdir/file.txt.
Carl

Génial. Cela m'a vraiment aidé. Je cherchais un moyen de trier les sous-répertoires depuis des lustres!
bhu Boue vidya
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.