it-swarm-eu.dev

Wie erhalte ich den Befehl find, um die Dateigröße mit dem Dateinamen auszudrucken?

Wenn ich den Befehl find wie folgt absetze:

$ find . -name *.ear

Es druckt aus:

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

Was ich in die Befehlszeile 'drucken' möchte, 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
85
Brian
find . -name '*.ear' -exec ls -lh {} \;

nur das Beste von jer.drab.org's Antwort. Spart geistig Zeit beim Konvertieren nach MB;)

92
shyam

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

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

-exec ist leistungsfähiger und ermöglicht die Ausführung beliebiger Befehle. Sie können also eine Version von 'ls' oder 'wc' verwenden, um den Dateinamen zusammen mit anderen Informationen auszudrucken. 'man find' zeigt Ihnen die verfügbaren Argumente für printf, die viel mehr können als nur Dateigröße.

[edit] -printf ist nicht im offiziellen POSIX-Standard enthalten. Überprüfen Sie daher, ob es von Ihrer Version unterstützt wird. Die meisten modernen Systeme verwenden jedoch GNU find oder eine ähnlich erweiterte Version, sodass die Wahrscheinlichkeit groß ist, dass sie implementiert wird.

94
Leigh Caldwell

eine einfache Lösung ist die Verwendung der Option -ls in find:

find . -name \*.ear -ls

Das gibt dir jeden Eintrag im normalen "ls-l" -Format. Um die gewünschte Ausgabe zu erhalten, gehen Sie wie folgt vor:

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

Womit Sie den Dateinamen gefolgt von der Größe in KB erhalten.

21
Michael Cramer

Mit Gnu Find, denke ich, ist das, was Sie wollen. Es werden alle realen Dateien und nicht die Verzeichnisse (-type f) gefunden. Für jede Datei werden der Dateiname (% p), ein Tabulator (\ t), die Größe in Kilobyte (% k), das Suffix "KB" und dann ausgegeben eine neue Zeile (\ n).

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

Wenn der Befehl printf die Elemente nicht wie gewünscht formatiert, können Sie exec verwenden, gefolgt von dem Befehl, den Sie für jede Datei ausführen möchten. Verwenden Sie {} für den Dateinamen und beenden Sie den Befehl mit einem Semikolon (;). Bei den meisten Shells sollten alle drei Zeichen mit einem Backslash versehen werden.

Hier ist eine einfache Lösung, die sie mit "ls -lh" findet und ausgibt. Sie zeigt die Größe in lesbarer Form an (k für Kilobyte, M für Megabyte):

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

Als weitere Alternative gibt "wc -c" die Anzahl der Zeichen (Bytes) in der Datei aus:

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

Dies gibt Ihnen nur die Dateigröße, anstatt alle unnötigen Dinge.

7
user2121791

Warum nicht du -a verwenden? Z.B.

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

Funktioniert auf einem Mac

4
Andreas

Awk kann die Ausgabe korrigieren, um genau das zu liefern, wonach der Fragesteller gefragt hat. Auf meinem Solaris 10-System gibt find -ls die Größe in KB als zweites Feld aus.

% 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 wählen Sie das Größenfeld aus der Ausgabe aus. Wieder unter 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

Unter Mac OS X hatte ich Probleme damit, da der Befehl find -printf Nicht unterstützt.

Eine Lösung, die ich gefunden habe und die zugegebenermaßen darauf beruht, dass die "Gruppe" für alle Dateien "Mitarbeiter" ist, war ...

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

Dadurch wird die lange Ausgabe in drei Token aufgeteilt

  1. das Zeug vor dem Text "Mitarbeiter"
  2. die Dateigröße
  3. der Dateiname

Und gibt dann die Token 2 und 3 aus, d. H. Die Ausgabe ist die Anzahl der Bytes und dann der Dateiname

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

Dies sollte Ihnen helfen, wonach Sie suchen, einschließlich Formatierung (d. H. Dateiname zuerst und Größe danach):

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

beispielausgabe (wo ich -iname "*.php" um ein Ergebnis 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
2
adriano72
 $ find. -name "test *" -exec du -sh {} \; 
 4.0K ./test1[.____.‹0 ./test2[.____.‹0 ./test3[.____.‹0. /test4[.____.‹$

Scripter World Referenz

1
scripter

Sie könnten dies versuchen:

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

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

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

Probieren Sie die folgenden Befehle aus:

GNU stat:

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

BSD stat:

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

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

find . -type f -name *.ear -exec sh -c 'echo "{} $(wc -c < {})"' ';'
1
kenorb
find . -name "*.ear" -exec ls -l {} \;
0
Jeremy Weathers