2008-09-15 10 views

Répondre

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

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

+6

Cette version va executer le processus "ls" pour chaque fichier. Si vous avez beaucoup de fichiers (disons plus d'un millier), vous devriez optimiser cela soit: 'trouver. -name '* .ear' exec ls -lh {} + \; '(extension GNU) ou ' trouver. -name '* .ear' -print0 | xargs -0 ls -lh'. Aussi, vous pouvez ajouter '-type f' si vous êtes seulement intéressé par les fichiers (ou ajouter' -d' à ls si vous voulez que les répertoires eux-mêmes soient inclus sans leur contenu). – ash108

+1

Votre réponse n'exclut pas les répertoires, de sorte que vous finira en cours d'exécution sur les répertoires ls aussi bien, ce qui est manifestement pas la bonne chose à faire. –

+1

C'est une manière vraiment inefficace de faire les choses - et malheureusement les commentaires de ash108 ne sont pas non plus idéaux. Il est préférable d'utiliser l'option -printf pour trouver. – oskarpearson

0
find . -name "*.ear" -exec ls -l {} \; 
0

Vous pouvez essayer ceci:

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

Cela vous donnera la taille en octets. Mais la commande du duo accepte aussi 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 
17

une solution simple est d'utiliser l'option -ls en trouver:

find . -name \*.ear -ls 

Cela vous donne chaque entrée dans la normale "ls -l" format. Ou, pour obtenir la sortie spécifique que vous semblez être à la recherche, ceci:

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

Ce qui vous donnera le nom du fichier suivi de la taille en kilo-octets.

74

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 de fichier ainsi que d'autres informations. 'man find' vous montrera les arguments disponibles pour printf, ce qui peut faire bien plus que de simples fichiers. [Edit] -printf n'est pas dans la norme officielle POSIX, donc vérifiez s'il est supporté par votre version. Cependant, la plupart des systèmes modernes utiliseront GNU find ou une version étendue similaire, il y a donc de bonnes chances que cela soit implémenté.

+0

Il semble que votre exemple est plus précis, mais je ne peux pas sembler obtenir l'exemple travailler sur Solaris 10. –

+0

Je crains Solaris trouver ne supporte pas -printf du tout: http://jrwren.wrenfam.com/blog/2006/10/07/solaris-find-sucks/ http: //www.cs.bgu.ac.il/~arik/usail/man/solaris/find.1.html Vous pouvez installer GNU find si vous pouvez être dérangé, sinon vous devez utiliser exec ou | comme suggéré par d'autres. –

+1

+1 Cela semble plus propre. Pour formater la sortie, je préférerais ajouter la commande 'column'. 'trouver. -name * .ear -printf "% p% k Ko \ n" | colonne -t' – Amol

13

En utilisant gnu find, je pense que c'est ce que vous voulez. Il trouve tous les fichiers réels et pas les répertoires (-type f), et pour chacun d'eux affiche le nom de fichier (% p), un onglet (\ t), la taille en kilo-octets (% k), le suffixe "KB", une nouvelle ligne (\ n).

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

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

Voici une solution simple qui trouve et les imprime en utilisant « ls -lh », qui vous montrera la taille sous forme lisible par l'homme (k pour kilo-octets, M pour méga-octets):

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

Comme encore une autre alternative, « wc -c » imprimera le nombre de caractères (octets) dans le fichier:

find . -type f -exec wc -c \{\} \; 
+0

+1 Sauf pour avoir omis '--name '* .ear' dans les exemples, cela devrait être la réponse # 1. Il répond précisément à la question, explique le sens de la syntaxe et donne plusieurs alternatives. – OsakaWebbie

+0

cela devrait être accepté réponse car il ne fonctionne pas nouvelle commande pour chaque ligne, donc il est beaucoup plus rapide que celui actuellement accepté de shyam – jirislav

3

Awk peut fixer la sortie pour donner tout ce que le questionneur a demandé. Sur mon système Solaris 10, trouver -ls imprime la taille en kilo-octets que le second champ, donc:

% 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 ls -exec -lh et choisir le champ de la taille de 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 
3

Je mal à comprendre ce sous Mac OS X où la commande find ne supporte pas -printf.

Une solution que je trouve, qui repose certes sur le « groupe » pour tous les fichiers étant « personnel » était ...

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

Cela divise la commande ls sortie longue en trois jetons

  1. les choses avant que le texte « personnel »
  2. la taille du fichier
  3. le nom du fichier

et sorties alors jetons 2 et 3, à savoir la sortie est le nombre d'octets et nom de fichier

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

Pourquoi ne pas utiliser du -a? Par exemple.

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

travaille sur un Mac

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

Cela vous donne la taille du fichier seulement, au lieu de toutes les choses inutiles.

+0

'wc' fonctionne pour cela tout juste mieux, si vous avez besoin de la taille en octets. – Alex

1

Cela devrait vous donner ce que vous cherchez, y compris le formatage (c.-à-d.nom de fichier première et la taille après):

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

échantillon (où je -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 
1

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, du ou wc pourrait être une meilleure approche:

find . -type f -name *.ear -exec sh -c 'echo "{} $(wc -c < {})"' ';' 
Questions connexes