Quel serait le meilleur moyen de répertorier les 100 premiers fichiers d’un répertoire triés par l’horodatage créé (le plus ancien en premier). Le répertoire est assez volumineux (environ 100 000 fichiers).
ls canalisé à tête prend énormément de temps à compléter.
Modifier:
Vous dites que "( ls connecté à tête met énormément de temps à Achevée".
La cause en est non pas ls
, mais le nombre de fichiers de votre répertoire. Si vous avez 100 000 fichiers dans un seul répertoire, tout moyen de résoudre ce problème devra obtenir des informations sur tous les 100 000 fichiers avant même de penser à les trier ou à imprimer des résultats.
Si cela prend trop de temps, la vraie solution consiste à fractionner les fichiers sur plusieurs répertoires.
Si vous ne pouvez pas répartir les fichiers sur plusieurs répertoires, pouvez-vous réduire le nombre de fichiers à prendre en compte ? par exemple. Si les noms de fichiers incluent une date, vous pouvez peut-être inclure un caractère générique afin que le système n'ait pas à trier 100 000 fichiers. Ou peut-être sont-ils numérotés séquentiellement? (Cela peut aider ou non, mais cela vaut la peine d'essayer.)
Combien de fois essayez-vous de faire cela? Peut-être vaut-il la peine de sauvegarder/mettre en cache la sortie pour la réutiliser .
Maintenant, une question.
Êtes-vous sûr que vous voulez dire "heure de création" et non pas "heure de changement" ? La plupart des outils peuvent uniquement afficher "heure de changement", pas "heure de création".
Obtenir le "temps de création" est une chose très nouvelle, qui nécessite un système de fichiers ext4 et des outils qui ne sont pas faciles à installer.
Si vous voulez changer l'heure
Changer l'heure (ctime) signifie l'heure à laquelle les attributs du fichier ont été modifiés pour la dernière fois.
ls -c
trie par ctime.
Vous voulez que la sortie apparaisse dans l'ordre croissant, pas décroissant, vous devez donc également l'inverser avec l'option -r
.
Pour que vous puissiez le faire comme ceci:
ls -cr | head -n 100
Une solution plus longue au même problème utilisant stat
:
find . -mindepth 1 -maxdepth 1 -exec stat -c $'%Z\t%n' '{}' \; |
sort -k 1n |
cut -f 2 -d $'\t' |
head -n 10 |
sed -e 's/^\.\///'
mais cela fonctionne plus lentement que ls -cr
sur mon système.
Si vous voulez le temps de modification
Heure de modification (mtime en abrégé) signifie l'heure à laquelle le contenu du fichier a été modifié pour la dernière fois.
ls -t
trie par mtime.
Changez ls -cr
en ls -tr
(meilleure option) ou changez stat -c $'%Z\t%n'
en stat -c $'%Y\t%n'
.
Si vous avez besoin de temps de création
(crtime pour faire court)
C'est plus difficile.
Tout d'abord, assurez-vous que le répertoire se trouve sur un système de fichiers formaté à l'aide de ext4
. Vous pouvez utiliser tune2fs -l <device name>
pour vérifier cela.
Ensuite, il existe un nouveau format stat
appelé %W
, qui peut vous aider ici. Pour l'obtenir, vous devrez télécharger une version de GNU Coreutils publiée en octobre 2010 ou après, l'extraire, la compiler et l'installer.
Ensuite, selon votre noyau, cela pourrait fonctionner (je ne l’ai pas essayé).
find . -mindepth 1 -maxdepth 1 -exec stat -c $'%W\t%n' '{}' \; |
sort -k 1n |
cut -f 2 -d $'\t' |
head -n 10 |
sed -e 's/^\.\///'
Voir également:
Si vous obtenez des erreurs à propos de "'$\t'
La notation '$\t'
requiert bash
ou zsh
: elle ne fonctionnera pas dans dash
ou sh
sur Ubuntu. Si vous avez vraiment besoin d’utiliser ces shells, vous devrez remplacer \t
par Ctrl+V, Tab et supprimez le $
qui précède juste avant la citation d’ouverture.
Une autre façon de faire les choses aujourd'hui pourrait être pertinente pour vos problèmes de performances:
I=0; ls -cr /dir/ | while read file; do I=`expr $I + 1`; echo "$file"; if [ $I == 100 ]; then break; fi; done
Cela devrait théoriquement commencer à produire beaucoup plus rapidement, mais je suppose que cela dépend d'où vient le retard. Il pourrait simplement falloir beaucoup de temps à ls
pour trier les fichiers.