2009-04-15 2 views
37

Я не нашел причины, по которой у Mac нет опции -printf. Apple обычно решает взять опции, которые не ортогональны другим командам?найти недостаток опции -printf, теперь что?

Как вы можете достичь того же результата, что и следующая команда на Mac без ядра?

find . -printf "%i \n"   // command in Ubuntu 

ответ

36

Это не то, что компания Apple удаляет параметры, то, что подкрепления UNIX OS X в основном получены (окольными) от FreeBSD, многие части которого могут быть прослежены назад к оригинальной UNIX ... в отличие от утилит GNU , которые являются повторными реализациями со многими добавленными функциями.

В этом случае FreeBSD's find(1) не поддерживает -printf, поэтому я не ожидал, что OS X тоже. Вместо этого, это должно работать в системе BSD-иш:

find . -print0 | xargs -0 stat -f '%i ' 

Это будет сбой в системе GNU-UserLand, хотя, где вы бы написать xargs -0 -r stat -c '%i ' потому xargs(1) и stat(1) поведение отличается.

+2

По какой-то причине это печатает цифры вместо строк в iTerm2 на OS X 10.8.4. Вместо этого 'gfind' из пакета' indutils' MacPorts, предложенного dmckee, отлично работает. –

+0

Это потому, что% i печатает inode. –

3

Ubuntu поставляется с GNU version of find, что более эффективно, чем поиск в Mac OS X от BSD lineage.

Фактически, большинство коммунальных услуг Ubuntu - это проект GNU. (Таким образом, вы иногда слышите системы на базе Linux, которые называются «GNU/Linux».)

13

Ну, ephemient и bendin пригвоздили причину.

Я бы добавил, что вам не нужно останавливать установку GNU find (от findutils), если вам это нужно. Если вы используете fink, есть findutils package. MacPorts имеет too.

+8

Вы можете установить его с помощью [Homebrew] (http://brew.sh/): 'brew install findutils' Используйте' gfind' вместо 'find'. – MacDada

+0

Установил его, но все же получил ошибку? – 3zzy

+0

@ 3zzy В ваш путь входит версия GNU? Приходит ли она до или после версии системы? Использование 'gfind' может принудительно использовать версию GNU. – dmckee

3

В качестве альтернативы, можно просто

find . -type f -exec stat -f "%z %N" {} \; 

Конечно, это не так, как вы могли бы сделать то же самое на Linux, но работает на MacOS

find . -type f -exec stat -c "%s %N" {} \; 

производит похожи (не то же самое, но близко) выход на linux.

6

MAX OS X find binary не поддерживает команду -printf. Установите brew install findutils на свой Mac. Установите gfind с параметром -printf.

 Смежные вопросы

  • Нет связанных вопросов^_^