Comment afficher les tailles de fichier «lisibles par l'homme» dans les résultats de recherche?

11

J'essaie de trouver tous les gros fichiers sur mon serveur Centos. Pour ce faire, j'utilise:

find / -maxdepth 10 -size +100000 -ls

J'ai essayé de changer -lspour , -lshmais ce ne sont pas permis.

Comment afficher ces résultats avec des tailles lisibles par l'homme (en utilisant les suffixes k, M,…)?

blarg
la source
Quelle est votre définition de lisible par l'homme? Pour moi, c'est assez lisible par l'homme.
manatwork
Vous devriez essayer l' fileutilitaire avec find.
Ramesh
@manatwork kb, mb, gb
blarg

Réponses:

10

findn'a pas d'options sophistiquées comme ls. Si vous le souhaitez ls -h, vous devez appeler ls.

find / -maxdepth 10 -size +100000 -exec ls -lh {} +

Je recommande l' -xdevoption pour éviter de se reproduire dans d'autres systèmes de fichiers, ce qui serait inutile si vous êtes préoccupé par l'espace disque.

find / -xdev -maxdepth 10 -size +100000 -exec ls -lh {} +

Si vous utilisez zsh comme shell, au lieu d'utiliser find, vous pouvez utiliser des qualificatifs glob. Limiter la taille du fichier est simple: Lsuivi d'une taille; la taille peut avoir une unité optionnelle avant le nombre. Si vous ne vous souciez pas de la profondeur maximale, vous pouvez utiliser **/pour recurse dans les sous-répertoires. Si vous vous souciez de la profondeur maximale, c'est plus lourd car les modèles de glob zsh n'ont pas de moyen d'exprimer «au plus n occurrences». Pour éviter la récursivité entre appareils, utilisez le dqualificatif glob; vous devez trouver le numéro de périphérique, que vous pouvez afficher avec la statcommande sous Linux ( stat -c %d /pour afficher uniquement le numéro) ou avec le propre programme statintégré de zsh (exécutez-le zmodload zsh/statpour le charger).

ls -lh /**/*(L+M99d$(stat -c %d /))
Gilles 'SO- arrête d'être méchant'
la source
4

La commande que vous essayez est lisible pour moi. Cependant, vous pouvez utiliser l'utilitaire de fichier avec la recherche ci-dessous.

find / -maxdepth 10 -size +100000 -exec sh -c 'file -b {} | grep text &>/dev/null' \; -print

Une autre façon de procéder consiste à utiliser la commande ci-dessous.

du -BM / | sort -nr

La commande ci-dessus vous donnera les fichiers dans la taille de fichier triée.

Si vous utilisez coreutils> 7.5 , vous pouvez exécuter la commande ci-dessous pour répertorier les fichiers par taille.

du -ah / | grep -v "/$" | sort -h

Dans ma machine, je n'avais pas l' sort -hoption disponible.

Comme vous l'aviez mentionné dans le commentaire, votre format lisible par l'homme est que le fichier doit avoir la taille en kb , mb ou gb . J'irais avec la deuxième commande que j'avais postée comme réponse. La sortie que j'ai obtenue lorsque je l'ai utilisée dans mon système est,

du -BM /home/ramesh/chk1/ | sort -nr

50M     /home/ramesh/chk1/
21M     /home/ramesh/chk1/Hierarchical_Clustering_Working
3M      /home/ramesh/chk1/checking_files
1M      /home/ramesh/chk1/checking/checking2
1M      /home/ramesh/chk1/checking/checking1
1M      /home/ramesh/chk1/checking/asdf
1M      /home/ramesh/chk1/checking
Ramesh
la source
Existe-t-il un moyen de définir une limite inférieure pour votre deuxième commande? Les fichiers les plus volumineux apparaissent en haut et disparaissent rapidement du haut de la coque EDIT - Je vois qu'il suffit de supprimer le r
blarg
Vous pouvez rediriger la sortie vers un fichier en ajoutant > outputà la commande. Ensuite, vous pouvez ouvrir le fichier et afficher la sortie comme vous le souhaitez :)
Ramesh
Je vois que cela affiche aussi les dossiers, alors que je ne suis qu'après les fichiers
blarg
du -a --max-depth=10 / | sort -rnest la fin que j'ai pu trouver. Cependant, dans ce cas, il n'affichera pas la taille en Ko, Mo ou Go.
Ramesh
1

Je pense que ce que vous recherchez ressemble plus à ce qui suit.

find / -maxdepth 10 -size +100000 -exec ls -lah {} + 

Le -execvous permet d'exécuter une commande et le {}est remplacé par le résultat de la recherche. Enfin, +c'est de dire que c'est la fin de la commande et qu'elle est obligatoire.

Tim Hughes
la source
2
Il n'est en fait absolument pas nécessaire de citer {}ici. Les guillemets simples dans la commande sont pour le shell mais le shell ne verra jamais du tout la ls -lah <args...>commande - il le voit {}, qui n'a pas besoin d'être cité. C'est ce findqui voit le ls -lah {}et c'est ce findqui étend le {}, et comme l'indique le nom de l' -execoption, findutilise exec*directement un appel système sur les arguments, donc il n'y aura pas de problème avec les espaces car findça ne va pas faire de division de mots sur vos noms de fichiers.
jw013
1
L' -aoption to lsn'est pas nécessaire car les arguments devraient être des fichiers et non des répertoires. GNU trouve des utilisations ls -dilspour l' -lsoption, donc pour la reproduire le plus fidèlement possible ls -dilsh.
jw013
man find donne ce qui suit pour le premier exemple d'utilisation de -exec : find . -type f -exec file '{}' \; Exécute un fichier sur chaque fichier dans ou en dessous du répertoire courant. Notez que les accolades sont placées entre guillemets simples pour les protéger de l'interprétation en tant que ponctuation de script shell. Le point-virgule est protégé de manière similaire par l'utilisation d'une barre oblique inverse, bien que des guillemets simples auraient pu être utilisés dans ce cas également.
Tim Hughes
1
La page de manuel préconise simplement une prudence inutile. Cela ne fera pas de mal, mais je ne connais aucun obus qui nécessite {}d'être cité.
jw013