Liste des files plus grands que {size} sortingés par date

Je veux résoudre le problème 'list les 10 derniers files les plus récents dans le directory courant sur 20MB'.

Avec ls je peux faire:

 ls -Shal |head 

pour get les 10 plus grands files, et:

 ls -halt |head 

get le top 10 des files les plus récents

Avec find je peux faire:

 find . -size +20M 

Pour listr tous les files de plus de 20 Mo dans le directory courant (et les sous-directorys, que je ne veux pas).

Existe-t-il un moyen de listr les dix files les plus récents sur une certaine taille, de preference en utilisant ls ?

L'option 'current directory' de find est -maxdepth 1 . Toute la command line pour vos besoins est la suivante:

 find . -maxdepth 1 -type f -size +20M -print0 | xargs -0 ls -Shal | head 

ou

 find . -maxdepth 1 -type f -size +20M -print0 | xargs -0 ls -halt | head 
 find . -maxdepth 1 -size +20M -printf "%T@ %f\n" | sort -nr | head -n 20 | sed 's/[^ ]\+ //' 

Commencer comme @Rajish, mais en utilisant la command printf de find pour spécifier le format de sortie. Il y a 3 formats temporels, atime, ctime et mtime%T est pour mtime, %A et %C pour les autres formats.

@ est de spécifier le timeformat en secondes depuis l'époque. %f est pour le nom de file, \n pour une nouvelle ligne entre 2 files.

Ensuite, sortinger par numéro dans l'ordre inverse donne les files les plus jeunes en premier, et nous prenons 20 lignes¹ avec la head .

À la fin, sed est utilisé, pour jeter l'information de time.

¹) puisque la head travaille ligne par ligne, un seul file avec plus de 20 lignes nouvelles dans le nom, ce qui est inhabituel mais non interdit, peut corrompre la sortie si elle fait partie des 20 premières correspondances. S'il vous arrive d'avoir de tels files, essayez de vous débarrasser d'eux – eh bien, pour changer de nom. Ils seront souvent un problème pour les scripts simples.

Les qualificatifs glob de Zsh rendent cela facile. Le . le qualificateur ne sélectionne que les files normaux, Lm+20 sélectionne les files d'au less 20 Mo plus un octet; pour inclure des files qui sont exactement 20 Mo de long, utilisez L+20971519 . Ensuite, sortinge en diminuant le time de modification, et [1,10] restreint l'expansion aux 10 premiers matches. Vous avez toujours besoin de l'option -t pour ls si vous voulez listr les files par date; ou vous pouvez passer les files à une autre command (la plus jeune en premier). Pour passer d'abord les files à une autre command avec le file le plus ancien, utilisez Om pour sortinger en augmentant le time de modification et [-10,-1] pour extraire les 10 dernières correspondances.

 ls -ltr -- *(.Lm+20om[1,10]) echo *(.Lm+20Om[-10,-1]) 

Je pense que cela pourrait être une meilleure façon de résoudre le problème …

 find . -maxdepth 1 -type f -size +20M -exec ls -Shal {} \+ | head 

Pour vous débarrasser d'éventuelles erreurs lors de la tentative d'access à des files que vous n'avez pas l'autorisation de lire, vous pouvez append

 find . -maxdepth 1 -type f -size +20M -exec ls -Shal {} \+ 2> /dev/null | head 

Cela n'imprimera que les 10 files spécifiés, quels que soient les caractères de nouvelle ligne incorporés dans les noms de file. Il utilise les inodes système de inodes

 cd "$1" for i in $(find . -maxdepth 1 -type f -size +20M -printf "%T@\t%i\n" \ | sort -nr | head | cut -f 2) do ls -l "$(find . -inum $i)" done 

Merci pour toutes les réponses. Ce que je suis allé est le suivant:

 ls -halt | grep "M " |head 

Bien qu'il renonce aux 20 mégaoctets en faveur de tout ce qui dépasse un mégaoctet (et sous un gigaoctet), il est facile de se souvenir et de préserver l'élément lisible par l'homme des files.