web-dev-qa-db-fra.com

Liste des fichiers supérieurs à {size} triés par date

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?

29
EoghanM

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
25
Rajish

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.

8
user unknown

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 
2
Dominic Williams

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
1
Peter.O

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.

0
EoghanM