На стороне Unix OS X является потомком NeXTSTEP, который был получен из 4.3BSD с базовыми частями ядра, замененного Махом.
NeXT, программируя API, который в конечном счете стал названным OpenStep, является основанием сегодняшнего Какао API для OS X. Два API отличались значительно, так как Apple купила NeXT в 1997, хотя существует текущие события усилия для обеспечения совместимых с API клонов Какао с открытым исходным кодом.
Добавьте к этому Классическую совместимость MacOS API, названный Углеродом, и у Вас есть интерфейс программирования OS X.
(Еще существует много к OS X, но они - приложения сверху всего этого: Средство поиска, BSD и инструменты пространства пользователя GNU, и т.д.)
Что касается идеи ядра FreeBSD, это - вид корректных, но это - бесхитростный способ посмотреть на него. Исходное ядро прибыло, как я сказал, от Затем, который собрал их первое ядро от 4.3BSD и Мах. Это означает, что и FreeBSD и NeXTSTEP совместно использовали некоторый код через 4.3BSD.
Мем, что OS X основан на FreeBSD, имеет два более свежих источника. Во-первых, Apple продолжила одалживать инновации у мира BSD, обычно у FreeBSD. Во-вторых, Apple наняла соучредителя проекта FreeBSD Jordan Hubbard вскоре после создания первого общедоступного выпуска OS X. Он работал на Apple в течение июня 2013.
Попытайтесь использовать находку -print0
или -printf
опция в сочетании с xargs
как это:
find /music -iname "*\.mp3" -print0 | xargs -0 mpg321
То, как это работает, объяснено страницей руководства находки:
- print0
Верный; распечатайте полное имя файла на стандартном выводе, сопровождаемом нулевым символом (вместо символа новой строки, которые - печатают использование). Это позволяет имена файлов, которые содержат новые строки или другие типы пробела, который будет правильно интерпретироваться программами, которые обрабатывают вывод находки. Эта опция соответствует-0 опциям xargs.
find /music -iname "*\.mp3" -exec mpg123 {} +
С GNU находят, можно также использовать -print0
и xargs -0
, но существует мало точки в изучении еще одного инструмента. -exec ... {} +
синтаксис получает мало упоминания, потому что Linux получил его позже, чем -print0
, но нет никакой причины не использовать его теперь.
С zsh или ударом 4, это намного более просто:
mpg123 **/*.[Mm][Pp]3
В zsh только, можно сделать (часть a) шаблон нечувствительный к регистру:
mpg123 (#i)**/*.mp3
Я думаю, что решение Steven является лучшим, но иначе состоит в том, чтобы использовать xargs' -I
флаг, который позволяет Вам указать строку, которая будет затем заменена в команде с аргументом (вместо того, чтобы просто добавить аргумент на конец команды). Можно использовать это для заключения в кавычки аргумента:
find /music -iname "*\.mp3" | xargs -0 -Ifoo mpg321 "foo"
-0
флаг без находки -print0
. Кроме того, xargs's -I
флаг имеет много последствий. В отличие от этого, просто xargs
который сожмет все строки от stdin в одну команду, xargs -I
выполнится mpg321
потенциально сотни или тысячи времен (однажды для каждого файла), который является, конечно, не намерением. Также имейте в виду, что заключение в кавычки нечто является ненужным как xargs
делает это внутренне. Заметьте, сжимаете ли Вы все имена файлов на строку строки и отправляете ее в xargs -I
, они не откроются.
– Six
06.05.2015, 15:43
Другой способ сделать это - экранировать все специальные символы, которые входят в имена ваших файлов. Например:
find /music -iname "*\.mp3" | sed 's!\([] \*\$\/&[]\)!\\\1!g' | xargs mpg321
Это в основном передаст правильно экранированные имена файлов в xargs для выполнения, и никаких проблем не возникнет.
Обычно лучше напрямую -exec $ {tgt_process} \ {\} +
, но если вы это делаете , необходимо получить список имен файлов с надежными разделителями в файле или потоке. из найдите
по какой-либо причине, тогда вы можете сделать следующее:
find -exec sh -c 'printf "///%s///\n" "$@"' -- \{\} +
Вы получите две уникальные строки. В начале каждого имени файла находится строка \ n ///
, а в конце каждого файла находится строка /// \ n
. Эти две строки больше нигде в выводе find
не встречаются, за исключением этих позиций, независимо от того, какие символы содержат имена файлов.
Кроме того, вышеупомянутое использование является базовой переносимостью POSIX, и на него можно положиться практически в любой системе Unix. Это не относится к использованию разделителя нулевого байта, несмотря на его удобство, рекомендованного некоторыми другими.
Но, опять же, это необходимо только в том случае, если вы не можете напрямую -exec
свой $ tgt_process
по какой-либо причине, поскольку это должно быть вашей целью. Во-первых, вышеупомянутый метод все еще требует синтаксического анализа. Например, если вы хотите, чтобы каждое имя файла было процитировано оболочкой, вам сначала нужно убедиться, что все жесткие кавычки в имени файла были экранированы:
find ... + | sed 's|'\''|&"&"&|g;s|///|'\''|g'
Это выводит правильно экранированный оболочкой массив имен файлов, независимо от того, какими бы они ни были составляющие символы . Теперь вам остается только надеяться, что ваше приложение на принимающей стороне не испортит его.
mpg321 $(find /music -iname "*\.mp3" -print0)
не? – phunehehe 01.10.2010, 20:13mpg321
не имеет никакого отношения к нему, это - оболочка, из которой это разбивает выводfind
в отдельные аргументы. И-print0 | xargs -0
будет работать с каждым возможным именем файла. – Gilles 'SO- stop being evil' 01.10.2010, 21:53