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.