web-dev-qa-db-fra.com

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

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
85
Brian
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;)

92
shyam

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.

94
Leigh Caldwell

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.

21
Michael Cramer

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 \{\} \;
19
dmazzoni
find . -name '*.ear' -exec du -h {} \;

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

7
user2121791

Pourquoi ne pas utiliser du -a? Par exemple.

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

Fonctionne sur un Mac

4
Andreas

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
4
tpgould

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

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

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
3
Mike M

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
2
adriano72
 $ find. -name "test *" -exec du -sh {}};; /test4
$

référence mondiale de Scripter

1
scripter

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
1
Yaba
find . -name "*.ear" | xargs ls -sh
1
killdash10

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 < {})"' ';'
1
kenorb
find . -name "*.ear" -exec ls -l {} \;
0
Jeremy Weathers