Si j'émets la commande find 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, c'est le nom et la taille:
./dir1/dir2/earFile1.ear 5000 KB
./dir1/dir2/earFile2.ear 5400 KB
./dir1/dir3/earFile1.ear 5400 KB
find . -name '*.ear' -exec ls -lh {} \;
juste le extra de la réponse de jer.drab.org. gagne du temps en convertissant mentalement en MB;)
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 afficher 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 fortes chances pour que celle-ci soit implémentée.
une solution simple consiste à utiliser l'option -ls dans find:
find . -name \*.ear -ls
Cela vous donne chaque entrée dans le format normal "ls -l". 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), un onglet (\ 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 {} pour le nom de fichier et terminez la commande par un point-virgule (;). Sur la plupart des obus, ces trois personnages doivent être évités avec une barre oblique inverse.
Voici une solution simple qui les trouve et les affiche en utilisant "ls -lh", qui vous montrera la taille sous une forme lisible par l'homme (k pour kilo-octets, M pour mégaoctets):
find . -type f -exec ls -lh \{\} \;
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.
Pourquoi ne pas utiliser du -a? Par exemple.
find . -name "*.ear" -exec du -a {} \;
Fonctionne sur un Mac
Awk peut corriger la sortie pour donner exactement ce que le questionneur a demandé. Sur mon système Solaris 10, find -ls imprime la taille en Ko en tant que 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
J'ai eu du mal avec cela sur Mac OS X où la commande find ne supporte pas -printf
.
Une solution que j'ai trouvée, qui repose certes sur le "groupe" pour tous les dossiers en tant que "personnel", était ...
ls -l -R | sed 's/\(.*\)staff *\([0-9]*\)..............\(.*\)/\2 \3/'
Cela divise la sortie ls long en trois jetons
Et puis sort les jetons 2 et 3, c’est-à-dire que la sortie est le nombre d’octets et ensuite le nom du 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
$ find. -name "test *" -exec du -sh {}};; /test4 $
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. Il vous donnera une sortie comme
5000 ./dir1/dir2/earFile1.ear
5400 ./dir1/dir2/earFile2.ear
5400 ./dir1/dir3/earFile1.ear
find . -name "*.ear" | xargs ls -sh
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 {} \;