Comment puis-je obtenir la commande find pour imprimer la taille du fichier avec le nom du fichier?

StackOverflow https://stackoverflow.com/questions/64649

Question

Si je lance la commande de recherche comme suit:

$ find . -name *.ear

Il imprime:

./dir1/dir2/earFile1.ear
./dir1/dir2/earFile2.ear
./dir1/dir3/earFile1.ear

Ce que je veux "imprimer" sur la ligne de commande est le nom et la taille:

./dir1/dir2/earFile1.ear  5000 KB
./dir1/dir2/earFile2.ear  5400 KB
./dir1/dir3/earFile1.ear  5400 KB
Était-ce utile?

La solution

find . -name '*.ear' -exec ls -lh {} \;

juste le h supplémentaire de la réponse de jer.drab.org. gagne du temps en convertissant mentalement en Mo;)

Autres conseils

Vous devez utiliser -exec ou -printf. Printf fonctionne comme ceci:

find . -name *.ear -printf "%p %k KB\n"

-exec est plus puissant et vous permet d'exécuter des commandes arbitraires. Vous pouvez donc utiliser une version de 'ls' ou 'wc' pour imprimer le nom du fichier ainsi que d'autres informations. 'man find' vous montrera les arguments disponibles pour printf, ce qui peut faire beaucoup plus que simplement la taille du fichier.

[edit] -printf n'est pas dans la norme officielle POSIX, vérifiez donc si elle est supportée par votre version. Cependant, la plupart des systèmes modernes utiliseront GNU find ou une version similaire étendue, il y a donc de bonnes chances qu’elle soit mise en œuvre.

une solution simple consiste à utiliser l'option -ls dans la recherche:

find . -name \*.ear -ls

Cela vous donne chaque entrée dans la liste " ls -l " normale format. Ou, pour obtenir le résultat spécifique que vous semblez rechercher, ceci:

find . -name \*.ear -printf "%p\t%k KB\n"

Ce qui vous donnera le nom du fichier suivi de la taille en Ko.

En utilisant gnu find, je pense que c’est ce que vous voulez. Il trouve tous les fichiers réels et non les répertoires (-type f), et pour chacun imprime le nom du fichier (% p), une tabulation (\ t), la taille en kilo-octets (% k), le suffixe " KB ", puis une nouvelle ligne (\ n).

find . -type f -printf '%p\t%k KB\n'

Si la commande printf ne formate pas les choses comme vous le souhaitez, vous pouvez utiliser exec, suivi de la commande à exécuter sur chaque fichier. Utilisez {} comme nom de fichier et terminez la commande par un point-virgule (;). Sur la plupart des obus, ces trois caractères doivent être protégés par une barre oblique inverse.

Voici une solution simple qui les trouve et les affiche en utilisant "ls -lh", qui vous indiquera la taille sous une forme lisible par l'homme (k pour kilo-octets, M pour mégaoctets):

find . -type f -exec ls -lh \{\} \;

Encore une autre alternative, "wc -c". affichera le nombre de caractères (octets) dans le fichier:

find . -type f -exec wc -c \{\} \;
find . -name '*.ear' -exec du -h {} \;

Cela vous donne uniquement la taille du fichier, au lieu de tout ce qui est inutile.

Awk peut corriger la sortie pour donner exactement ce que le questionneur a demandé. Sur mon système Solaris 10, find -ls affiche la taille en Ko dans le deuxième champ, ainsi:

% find . -name '*.ear' -ls | awk '{print $2, $11}'
5400 ./dir1/dir2/earFile2.ear
5400 ./dir1/dir2/earFile3.ear
5400 ./dir1/dir2/earFile1.ear

Sinon, utilisez -exec ls -lh et sélectionnez le champ de taille dans la sortie. Encore une fois sur Solaris 10:

% find . -name '*.ear' -exec ls -lh {} \; | awk '{print $5, $9}'
5.3M ./dir1/dir2/earFile2.ear
5.3M ./dir1/dir2/earFile3.ear
5.3M ./dir1/dir2/earFile1.ear

Pourquoi ne pas utiliser du -a ? Par exemple.

find . -name "*.ear" -exec du -a {} \;

Fonctionne sur un Mac

J'ai eu des difficultés avec cela sous Mac OS X, où la commande de recherche ne prend pas en charge -printf .

Une solution que j’ai trouvée, qui repose certes sur le "groupe" de tous les fichiers étant "personnel", était ...

ls -l -R | sed 's/\(.*\)staff *\([0-9]*\)..............\(.*\)/\2 \3/'

Ceci divise la sortie ls long en trois jetons

  1. les choses avant le texte 'staff'
  2. la taille du fichier
  3. le nom du fichier

Ensuite, les jetons 2 et 3 sont générés, c'est-à-dire que le résultat est le nombre d'octets, puis le nom de fichier

.
8071 sections.php
54681 services.php
37961 style.css
13260 thumb.php
70951 workshops.php

Cela devrait vous donner ce que vous cherchez, formatage inclus (c'est-à-dire le nom du fichier en premier et sa taille ensuite):

find . -type f -iname "*.ear" -exec du -ah {} \; | awk '{print $2"\t", $1}'

exemple de sortie (où j'ai utilisé -iname "*. php" pour obtenir un résultat):

./plugins/bat/class.bat.inc.php  20K
./plugins/quotas/class.quotas.inc.php    8.0K
./plugins/dmraid/class.dmraid.inc.php    8.0K
./plugins/updatenotifier/class.updatenotifier.inc.php    4.0K
./index.php      4.0K
./config.php     12K
./includes/mb/class.hwsensors.inc.php    8.0K

Vous pouvez essayer ceci:

find. -name *.ear -exec du {} \;

Cela vous donnera la taille en octets. Mais la commande du accepte également les paramètres -k pour KB et -m pour MB. Cela vous donnera un résultat comme

5000  ./dir1/dir2/earFile1.ear
5400  ./dir1/dir2/earFile2.ear
5400  ./dir1/dir3/earFile1.ear
find . -name "*.ear" | xargs ls -sh
$ find . -name "test*" -exec du -sh {} \;
4.0K    ./test1
0       ./test2
0       ./test3
0       ./test4
$

Référence de Scripter World

Essayez les commandes suivantes:

GNU stat :

find . -type f -name *.ear -exec stat -c "%n %s" {} ';'

BSD stat :

find . -type f -name *.ear -exec stat -f "%N %z" {} ';'

cependant stat n'est pas standard, donc du ou wc pourrait être une meilleure approche:

find . -type f -name *.ear -exec sh -c 'echo "{} $(wc -c < {})"' ';'
find . -name "*.ear" -exec ls -l {} \;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top