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


27

Je veux résoudre le problème «lister les 10 premiers fichiers les plus récents du répertoire actuel sur 20 Mo».

Avec lsje 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 fichiers les plus récents au-dessus d'une certaine taille, de préférence en utilisant ls?

Réponses:


24

L'option 'répertoire courant' pour findest -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

8

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 printfcommande de findpour spécifier le format de sortie. Il existe 3 formats liés à temps, atime, ctime et mtime - %Test pour mtime, %Aet %Csont pour les autres formats.

@est de spécifier le format de temps en secondes depuis l'époque. %fest pour le nom de fichier, \npour une nouvelle ligne entre 2 fichiers.

Ensuite, le tri par numéro dans l'ordre inverse donne d'abord les fichiers les plus jeunes, et nous prenons 20 lignes¹ avec head.

En fin de compte, sedest utilisé pour jeter les informations de temps.

¹) puisque headfonctionne 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, changez leur nom. Ils seront souvent un problème pour les scripts simples.


1
Si vous utilisez filede » -lsla commande, les caractères spéciaux seront imprimés en caractères échappés backslash-: find . -maxdepth 1 -size +20M -printf "%T@ " -ls | sort -nr | head -n 20 | sed 's/[^ ]\+ //'. De plus, le format ressemblera ls -l, EoghanM a également spécifié de -ltoute façon.
manatwork

printfne fonctionne que pour des distributions GNU spécifiques.
Brethlosze

%T+génère des horodatages lisibles par l'homme comme ceux 2018-11-06+13:37:54.4606466460qui sont également triables par sort(sans -n), voir: unix.stackexchange.com/questions/29899/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

5

Les qualificatifs glob de Zsh rendent cela facile. Le .qualificatif sélectionne uniquement les fichiers normaux, Lm+20sé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. omTrie ensuite en diminuant le temps de modification et [1,10]limite l'expansion aux 10 premières correspondances. Vous avez toujours besoin de l' -toption lspour répertorier 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 Ompour trier en augmentant le temps de modification et [-10,-1]pour extraire les 10 dernières correspondances.

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

2

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 l'autorisation de lire, vous pouvez ajouter

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

1

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 un système de fichiersinodes

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

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.


4
Vous ne devez pas essayer d'analyser la sortie de ls, il vous montre une représentation des fichiers, rien de plus. Pour les noms de fichiers simples, la sortie est généralement équivalente au nom de fichier, mais vous ne devez pas vous y fier.
Chris Down du

C'est vrai, j'en suis sûr, mais en ce qui concerne un utilisateur humain (et la sortie n'étant pas acheminée ailleurs), celui-ci est plus facile à retenir car il peut être assemblé plus facilement à partir d'outils simples connus tldp.org/LDP/GNU-Linux- Tools-Summary / html / c1089.htm
EoghanM
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.