2008-09-15 14 views
64

Если я выполняю команду найти следующим образом:Как заставить команду find распечатать размер файла с именем файла?

$ find . -name *.ear 

Он печатает:

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

То, что я хочу «Печать» в командной строке имя и размер:

./dir1/dir2/earFile1.ear 5000 KB 
./dir1/dir2/earFile2.ear 5400 KB 
./dir1/dir3/earFile1.ear 5400 KB 

ответ

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

только h дополнительно от ответа jer.drab.org. экономит время, превращаясь в MB умственно;)

0

Вы можете попробовать это:

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

Это даст вам размер в байтах. Но команда du также принимает параметры -k для KB и -m для MB. Это даст вам выход как

5000 ./dir1/dir2/earFile1.ear 
5400 ./dir1/dir2/earFile2.ear 
5400 ./dir1/dir3/earFile1.ear 
17

простым решением является использование -ls опции в находке:

find . -name \*.ear -ls 

Это дает вам каждую запись в нормальный «Ls -l» формат. Или, чтобы получить конкретный вывод, который вы, кажется, ищет, это:

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

Который даст вам имя файла с последующим размером в КБ.

74

Вам необходимо использовать -exec или -printf. Printf работает следующим образом:

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

-exec является более мощным и позволяет выполнять произвольные команды - так что вы можете использовать версию «LS» или «туалет», чтобы распечатать имя файла вместе с другой информацией. «man find» покажет вам доступные аргументы printf, которые могут сделать намного больше, чем просто размер файла.

[edit] -printf не находится в официальном стандарте POSIX, поэтому проверьте, поддерживается ли оно в вашей версии. Тем не менее, большинство современных систем будут использовать GNU find или аналогичную расширенную версию, поэтому есть шанс, что она будет реализована.

+0

Похоже, ваш пример является более точным, но я не могу показаться, чтобы получить пример работа на Solaris 10. – 2008-09-15 17:21:18

+0

Боюсь, что Solaris find не поддерживает -printf: http://jrwren.wrenfam.com/blog/2006/10/07/solaris-find-sucks/ http: //www.cs.bgu.ac.il/~arik/usail/man/solaris/find.1.html Вы можете установить GNU find, если вас беспокоит, иначе вам нужно использовать exec или | как это было предложено другими. – 2008-09-15 17:27:44

+1

+1 Это кажется более чистым. Для форматирования вывода я бы предпочел добавить команду `column`. `найти. -name * .ear -printf "% p% k KB \ n" | column -t` – Amol 2012-12-06 09:53:39

13

Использование gnu find, я думаю, что это то, что вы хотите. Он находит все реальные файлы, а не каталоги (-type f), и для каждого печатает имя файла (% p), вкладку (\ t), размер в килобайтах (% k), суффикс «KB», а затем символ новой строки (\ n).

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

Если команда Printf не форматировать вещи так, как вы хотите, вы можете использовать EXEC, а затем команду, которую вы хотите выполнить на каждом файле. Используйте {} для имени файла и завершите команду точкой с запятой (;). На большинстве оболочек все три этих символа должны быть экранированы с обратной косой чертой.

Вот простое решение, которое находит и выводит их с помощью «LS -lh», который покажет вам размер в виде читабельной (к для килобайт, M для мегабайт):

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

Как еще одна альтернатива, «туалет -c» напечатает число символов (байт) в файле:

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

Awk может исправить выход дать только то, что спрашивающий просил. В моей системе Solaris 10, найти -ls размер отпечатков в КБ в качестве второго поля, так:

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

В противном случае, используйте -exec Ls -lh и выбрать поле размера от выхода. Опять на 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

Я боролся с этим на Mac OS X, где команда находкой не поддерживает -printf.

Решение, которое я нашел, что по общему признанию, опирается на «группу» для всех файлов, «персонал» был ...

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

Это разбивает низкоспиновое длинный выход на три лексемы

  1. материал перед текстом размера
  2. файл «сотрудник»
  3. имя файла

, а затем выводит маркеры 2 и 3, то есть выход число байтов, а затем имя файла

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

Почему бы не использовать дю -a? Например.

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

работает на Mac

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

Это дает вам только размер файла, а не все ненужные вещи.

1

Это должно получить то, что вы ищете, включая форматирование (т.имя файла первый и размер после):

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

выход образца (где я использовал -iname "*.php", чтобы получить какой-то результат):

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

Попробуйте следующие команды:

GNU stat:

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

BSD stat:

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

однако stat не является стандартным, так du или wc может быть лучшим подходом:

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