Rechercher des fichiers antérieurs à X jours et les afficher en fonction de leur taille

8

J'essaie d'obtenir les fichiers plus anciens que plusieurs jours et de les répertorier par ordre décroissant en fonction de leur taille avec toutes leurs informations (taille, chemin complet, etc. - quelque chose de similaire qui est fourni par ls).

Bien que je puisse localiser des fichiers plus anciens avec:

find . -mtime +10

Je ne suis pas en mesure de lister les informations souhaitées.

user148335
la source
veuillez ajouter vos informations de distribution et de shell
lese
@lese: AIX 6.1; tandis que echo $ SHELL -> / usr / bin / ksh
user148335
Cela ressemble à un XYProblem ... avez-vous vraiment, comme vous le demandez, besoin de TOUS les fichiers par ordre de taille? ou cherchez-vous (plus probablement) des fichiers "anciens" (> 10 jours) assez gros et avez-vous juste besoin, disons, des 200 plus gros pour ensuite décider lequel de ceux que vous pouvez supprimer pour économiser de l'espace?. Dans ce dernier cas, et puisque vous êtes sur AIX sans peut-être aucun outil gnu, une combinaison de find (sortie de tous les fichiers> 10 jours) et awk (conservation des 200 fichiers les plus volumineux dans un tableau, puis sortie dans l'ordre) sera votre meilleur pari
Olivier Dulac

Réponses:

8

À condition que vos chemins de fichier ne contiennent pas de caractères de nouvelle ligne:

find . -mtime +10 -printf "%s %n %m %u %g %t %p" \( \
  -type l -printf ' -> %l\n' -o -printf '\n' \) | sort -k1,1 -n

Voir le findmanuel , section Actions.

  • %s Taille du fichier en octets.
  • %n Nombre de liens durs vers le fichier.
  • %m Bits d'autorisation du fichier (en octal ).
  • %u Nom d'utilisateur du fichier ou ID utilisateur numérique si l'utilisateur n'a pas de nom.
  • %g Nom de groupe du fichier ou ID de groupe numérique si le groupe n'a pas de nom.
  • %t Dernière heure de modification du fichier au format renvoyé par la ctimefonction C.
  • %p Nom du fichier.
  • %l Objet du lien symbolique (chaîne vide si le fichier n'est pas un lien symbolique).

BTW: Notez que le manuel POSIX find ne spécifie pas la plupart des actions ci-dessus.

patryk.beza
la source
1
Il dit: find: 0652-017 -printf n'est pas une option valide.
user148335
pour moi, cela fonctionne et semble une solution assez propre +1
lese
@ user148335, vous n'avez pas mentionné la distribution Linux que vous utilisez. Il semble que vous soyez limité à la spécification de recherche POSIX , qui est assez limitée.
patryk.beza
1
@ patryk.beza Je suppose que vous parliez avec user148335
lese
AIX 6.1; while echo $ SHELL -> / usr / bin / ksh
user148335
4

Cette commande utilise uniquement les fonctionnalités POSIX de findet de ls:

find . -type f -mtime +10 -exec ls -lS {} +

Cependant, il peut appeler lsplusieurs fois s'il existe un très grand nombre de fichiers dans le répertoire courant (ou sous-répertoires récursivement) correspondant au -mtime +10primaire.

S'il appelle lsplus d'une fois, bien sûr, le tri ne sera effectué qu'à l'intérieur de chaque lsexécution, pas sur plusieurs exécutions.

Pourtant, pour un nombre raisonnable de fichiers, c'est probablement votre meilleur pari.

Miguel G
la source
La version mise à jour ne rompt pas avec les espaces dans le nom
Miguel G
1
Si lsun seul argument est passé, il y a peu de tri qu'il peut y faire. Avec +au lieu de ;, ce serait mieux, mais lspourrait toujours être appelé plusieurs fois s'il y a beaucoup de fichiers.
Stéphane Chazelas
2
C'est la commande exacte que j'aurais donnée, j'ai donc ajouté le texte explicatif que j'aurais donné pour l'accompagner.
Wildcard
3

Avec zsh:

ls -ldrS -- **/*(m+10)

Ou pour éviter le double tri (par nom par zsh et par taille par ls):

ls -ldrS -- **/*(m+10oN) # disable zsh sorting

ou (si votre lssoutien -Upour non trié):

ls -ldU -- **/*(m+10oL) # disable ls sorting and have zsh sort by size

Ajoutez le Dqualificatif glob si vous souhaitez également voir les fichiers cachés.

Stéphane Chazelas
la source
Est-ce que cela fonctionne lorsque les noms d'utilisateur et de groupe contiennent des espaces?
roaima
@roaima, oui. Pourquoi pas? Il peut se casser pour E2BIG, que vous pouvez contourner en utilisant zargs.
Stéphane Chazelas
Depuis que vous l'avez fourni, je soupçonnais que ce serait bien, mais je devais demander :-)
roaima
1

Je pense que vous pourriez faire quelque chose de similaire à:

find . -type f -mtime +10 -print0 | sort -n -r -k1 | while IFS= read -r -d $'\0' line; do
    #echo "$line"
    ls -lS "$line"    
done

notez le -Sparamètre de lscommande:

-S trier par taille de fichier

lèse
la source
Après avoir supprimé -d $ '\ 0' à cause du message: $ \ 0: Ce n'est pas un identifiant que j'ai réussi à obtenir la sortie mais les fichiers ne sont pas écrits en ordre décroissant en fonction de leur taille
user148335
Se cassera lorsque vous rencontrerez un répertoire sous /home/phphil. Essayezls -ld ...
roaima
@Roaima, que diriez-vous d'utiliser à la find . -type fplace?
lese
@lese J'ai changé le code mais la commande semble lancer deux fois chaque fichier de chaque sous-dossier. Ex.
user148335
find ... -type ffonctionnerait, tout comme l'ajout du -ddrapeau àls
roaima
1

essaye ça:

find ./ -type f -mtime +10 -exec ls -ln {} \; | sort -r -k 5 -g
dervishe
la source
Avec l'option -n, ce n'est pas un problème car ls ne répertorie pas le nom d'utilisateur et le nom de groupe mais uid et gid à la place
dervishe
0

Pour une ligne plus simple, vous pouvez utiliser l' findoption -ls. Il apparaît dans la plupart des cas que la taille du fichier se trouve dans la septième colonne des informations répertoriées (changez donc 7à la fin de la commande si cela n'est pas le cas):

find . -type f -mtime +10 -ls | sort -n -r -k7
woodengod
la source
0

Une autre variante serait d'utiliser:

  • find (pour trouver les fichiers correspondants)
  • du (pour afficher la taille du fichier en Ko)
  • trier -n -r (abréger par ordre décroissant)

Voici la commande:

find . -type f -mtime +10 -exec du -k {} \; | sort -n -r
Stephen Quan
la source