Как заставить команду find распечатать размер файла с именем файла?

Если я выдаю команду 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

Ответ 1

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

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

Ответ 2

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

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

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

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

Ответ 3

простое решение - использовать опцию -ls в find:

find . -name \*.ear -ls

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

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

Что даст вам имя файла, за которым следует размер в KB.

Ответ 4

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

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

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

Здесь простое решение, которое находит и распечатывает их, используя "ls -lh", который покажет вам размер в удобочитаемой форме (k для килобайт, M для мегабайт):

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

В качестве еще одной альтернативы "wc -c" будет печатать количество символов (байтов) в файле:

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

Ответ 5

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

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

Ответ 6

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

% 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

Ответ 7

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

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

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

Это разделяет длинный вывод ls на три маркера

  • материал перед текстом "Персонал"
  • размер файла
  • имя файла

И затем выдает токены 2 и 3, то есть вывод - это количество байтов, а затем имя файла

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

Ответ 8

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

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

Работает на Mac

Ответ 10

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

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

sample output (где я использовал -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

Ответ 11

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

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 < {})"' ';'

Ответ 12

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

Ответ 13

Вы можете попробовать следующее:

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

Ответ 14

find . -name "*.ear" | xargs ls -sh