Как мне заставить команду find распечатать размер файла с именем файла?
-
09-06-2019 - |
Вопрос
Если я выдам команду 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
Решение
find . -name '*.ear' -exec ls -lh {} \;
просто дополнительная буква h из ответа jer.drab.org.экономит время на мысленном преобразовании в MB ;)
Другие советы
Вам нужно использовать -exec или -printf.Printf работает следующим образом:
find . -name *.ear -printf "%p %k KB\n"
-exec более мощный и позволяет выполнять произвольные команды - так что вы могли бы использовать версию 'ls' или 'wc', чтобы распечатать имя файла вместе с другой информацией.'man find' покажет вам доступные аргументы для printf, которые могут делать намного больше, чем просто изменять размер файла.
[редактировать] -printf отсутствует в официальном стандарте POSIX, поэтому проверьте, поддерживается ли он в вашей версии.Однако большинство современных систем будут использовать GNU find или аналогичную расширенную версию, так что есть большая вероятность, что она будет реализована.
простое решение - использовать опцию -ls в find:
find . -name \*.ear -ls
Это дает вам каждую запись в обычном формате "ls -l".Или, чтобы получить конкретный результат, который вы, кажется, ищете, это:
find . -name \*.ear -printf "%p\t%k KB\n"
Который выдаст вам имя файла, за которым следует размер в КБ.
Используя gnu find, я думаю, это то, что вы хотите.Он находит все реальные файлы, а не каталоги (-введите f), и для каждого из них выводит имя файла (%p), табуляцию ( ), размер в килобайтах (%k), суффикс "KB", а затем перевод строки ( ).
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 \{\} \;
find . -name '*.ear' -exec du -h {} \;
Это дает вам только размер файла, вместо всего ненужного.
Awk может исправить вывод, чтобы выдать именно то, о чем просил спрашивающий.В моей системе Solaris 10 find -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
Почему бы не использовать du -a ?Например.
find . -name "*.ear" -exec du -a {} \;
Работает на компьютере Mac
Я боролся с этим в 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
Это должно дать вам то, что вы ищете, включая форматирование (т. е.сначала имя файла, а затем размер):
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
Вы могли бы попробовать это:
find. -name *.ear -exec du {} \;
Это даст вам размер в байтах.Но команда du также принимает параметры -k для КБ и -m для МБ.Это даст вам такой результат, как
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 $
Попробуйте выполнить следующие команды:
ГНУ 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 < {})"' ';'
find . -name "*.ear" -exec ls -l {} \;