Je veux résoudre le problème "lister les 10 premiers fichiers les plus récents dans le répertoire actuel sur 20 Mo".
Avec ls
je peux faire:
ls -Shal |head
pour obtenir les 10 fichiers les plus volumineux et:
ls -halt |head
pour obtenir les 10 fichiers les plus récents
Avec find, je peux faire:
find . -size +20M
Pour répertorier tous les fichiers de plus de 20 Mo dans le répertoire actuel (et les sous-répertoires, ce que je ne veux pas).
Existe-t-il un moyen de répertorier les dix premiers fichiers les plus récents d'une certaine taille, de préférence en utilisant ls
?
L'option 'répertoire courant' pour find
est -maxdepth 1
. La ligne de commande entière pour vos besoins est:
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
Remarque: Cela fonctionnera pour GNU-find, mais pas pour toutes les autres.
find . -maxdepth 1 -size +20M -printf "%T@ %f\n" |
sort -nr | head -n 20 | sed 's/[^ ]\+ //'
Commençant comme @Rajish, mais en utilisant la commande printf
de find
pour spécifier le format de sortie. Il existe 3 formats liés au temps, atime, ctime et mtime - %T
est pour mtime, %A
et %C
sont pour les autres formats.
@
est de spécifier le format de temps en secondes depuis Epoch. %f
correspond au nom de fichier, \n
pour une nouvelle ligne entre 2 fichiers.
Ensuite, le tri par numéro dans l'ordre inverse donne les fichiers les plus jeunes en premier, et nous prenons 20 lignes¹ avec head
.
En fin de compte, sed
est utilisé pour jeter les informations de temps.
¹) puisque head
fonctionne ligne par ligne, un seul fichier avec plus de 20 sauts de ligne dans le nom, ce qui est un peu inhabituel, mais pas interdit, peut corrompre la sortie si elle appartient aux 20 premières correspondances. Si vous avez de tels fichiers, essayez de vous en débarrasser - enfin, de changer leur nom. Ils seront souvent un problème pour les scripts simples.
Les qualificatifs glob de Zsh facilitent la tâche. Le .
le qualificatif ne sélectionne que les fichiers normaux, Lm+20
sélectionne les fichiers d'au moins 20 Mo plus un octet de long; pour inclure des fichiers d'une longueur exacte de 20 Mo, utilisez L+20971519
. Puis om
trie en diminuant le temps de modification, et [1,10]
limite l'extension aux 10 premiers matchs. Vous avez toujours besoin du -t
option à ls
si vous voulez lister les fichiers par date; ou vous pouvez passer les fichiers à une autre commande (la plus jeune en premier). Pour passer les fichiers à une autre commande avec le fichier le plus ancien en premier, utilisez Om
pour trier en augmentant le temps de modification et [-10,-1]
pour extraire les 10 derniers matchs.
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 de toute erreur pendant que find essaie d'accéder à des fichiers que vous n'avez pas la permission de lire, vous pouvez ajouter
find . -maxdepth 1 -type f -size +20M -exec ls -Shal {} \+ 2> /dev/null | head
Cela n'imprimera que les 10 fichiers spécifiés, quels que soient les caractères de nouvelle ligne intégrés dans les noms de fichiers. Il utilise le système de fichiers 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é chercher est le suivant:
ls -halt | grep "M " |head
Bien qu'il renonce aux 20 mégaoctets au profit de quoi que ce soit au-dessus d'un mégaoctet (et sous un gigaoctet), il est facile à retenir et préserve l'élément lisible par l'homme des tailles de fichiers.