Frage

Wenn ich den Fund Befehl wie folgt:

$ find . -name *.ear

Es druckt:

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

Was ich an die Befehlszeile zu ‚drucken‘ will, ist der Name und die Größe:

./dir1/dir2/earFile1.ear  5000 KB
./dir1/dir2/earFile2.ear  5400 KB
./dir1/dir3/earFile1.ear  5400 KB
War es hilfreich?

Lösung

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

nur die h Extras von jer.drab.org Antwort. spart Zeit MB Umwandlung geistig;)

Andere Tipps

Sie müssen -exec oder -printf verwenden. Printf funktioniert wie folgt:

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

-exec ist leistungsfähiger und ermöglicht es Ihnen, beliebige Befehle auszuführen - so könnte man eine Version von ‚ls‘ oder ‚wc‘ verwendet aus dem Dateinamen drucken zusammen mit anderen Informationen. ‚Mann finden‘ finden Sie die verfügbaren Argumente zu printf zeigen, die nur Dateigröße viel mehr als tun können.

[Bearbeiten] -printf ist nicht im offiziellen POSIX-Standard, so überprüfen Sie, ob es auf Ihrer Version unterstützt wird. Allerdings werden die meisten modernen Systeme verwenden GNU oder eine ähnlich erweiterte Version finden, so gibt es eine gute Chance, es wird umgesetzt werden.

eine einfache Lösung ist es, die Option -ls in Suche zu verwenden:

find . -name \*.ear -ls

Das gibt Ihnen jeden Eintrag in der normalen „ls -l“ -Format. Oder die spezifische Leistung zu bekommen scheinen, nach dem Sie suchen, diese:

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

Welche geben Sie den Dateinamen durch die Größe in KB gefolgt.

Gnu FIND, ich denke, das ist das, was Sie wollen. Es findet alle realen Dateien und keine Verzeichnisse (Typ f), und für jeden einzelnen druckt den Namen (% p), ein Register (\ t), die Größe in Kilobyte (% k), das Suffix „KB“ und dann eine Neue-Zeile (\ n).

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

Wenn der printf Befehl formatiert die Dinge nicht so, wie Sie wollen, können Sie mit exec, gefolgt von dem Befehl, den Sie für jede Datei ausgeführt werden soll. Verwenden {} für die Dateinamen, und beenden den Befehl mit einem Semikolon (;). Auf den meisten Muscheln, sollten alle drei dieser Zeichen mit einem Backslash geschützt werden.

Hier ist eine einfache Lösung, die findet und druckt sie aus „ls -lh“ verwenden, mit dem Sie die Größe in lesbarer Form (k für Kilobyte, M für Megabyte) zeigen:

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

Als noch eine weitere Alternative "wc -c" wird die Anzahl der Zeichen (Bytes) in der Datei drucken:

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

Das gibt Ihnen die Dateigröße nur, anstatt alle unnötigen Sachen.

Awk kann die Ausgabe reparieren zu geben, was nur die Fragesteller gefragt. Auf meinem 10 System Solaris, -ls druckt Größe in KB als das zweite Feld finden, so:

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

Verwenden Sie andernfalls exec ls -lh und von dem Ausgang des Größenfeld auszusuchen. Wieder auf 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

Warum nicht ich -a ? Z.B.

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

Arbeiten auf einem Mac

kämpfte ich mit diesem auf Mac OS X, wo der Befehl find nicht -printf nicht unterstützt.

Eine Lösung, die ich gefunden, die auf der ‚Gruppe‘ für alle Dateien zu sein ‚Personal‘ war ...

zugegebenermaßen stützt
ls -l -R | sed 's/\(.*\)staff *\([0-9]*\)..............\(.*\)/\2 \3/'

Dies teilt die ls lange Ausgabe in drei Token

  1. die Sachen vor dem Text 'Personal'
  2. die Dateigröße
  3. der Dateiname

Token und gibt dann 2 und 3, das heißt Ausgang Anzahl von Bytes und dann Dateinamen

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

Das sollten Sie bekommen, was Sie suchen, (d Dateiname ersten und Größe später) enthalten Formatierung:

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

Beispielausgabe (wo ich -iname "*.php" einige Ergebnisse zu erhalten):

./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

Sie könnten versuchen, diese:

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

Dies wird Ihnen die Größe in Bytes geben. Aber der Befehl du übernimmt auch die Parameter -k für KB und -m für MB. Es wird Ihnen eine Ausgabe wie

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
$

Scripter Welt Referenz

Versuchen Sie, die folgenden Befehle ein:

GNU stat:

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

BSD stat:

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

jedoch stat ist nicht Standard, so du oder wc könnte ein besserer Ansatz sein:

find . -type f -name *.ear -exec sh -c 'echo "{} $(wc -c < {})"' ';'
find . -name "*.ear" -exec ls -l {} \;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top