как передать результат 'находки' как список файлов?

На стороне 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.

11
01.10.2010, 19:04
5 ответов

Попытайтесь использовать находку -print0 или -printf опция в сочетании с xargs как это:

find /music -iname "*\.mp3" -print0 | xargs -0 mpg321

То, как это работает, объяснено страницей руководства находки:

- print0

Верный; распечатайте полное имя файла на стандартном выводе, сопровождаемом нулевым символом (вместо символа новой строки, которые - печатают использование). Это позволяет имена файлов, которые содержат новые строки или другие типы пробела, который будет правильно интерпретироваться программами, которые обрабатывают вывод находки. Эта опция соответствует-0 опциям xargs.

16
27.01.2020, 19:57
  • 1
    " сред POSIX Извините за все редактирование. Я, кажется, помню шаблон-print0 xarg-0, переставший работать на других типах пробела, но я не мог найти пример. –  Steven D 01.10.2010, 19:35
  • 2
    ах да, который работает! но я все еще задаюсь вопросом почему mpg321 $(find /music -iname "*\.mp3" -print0) не? –  phunehehe 01.10.2010, 20:13
  • 3
    Ну, я полагаю, что это не работает по двум причинам: (1) имена файлов разделяются нулевыми символами, который не является тем, что mpg321 ожидает вообще и (2) xargs делает работу выхода из другого пробела, не находят. –  Steven D 01.10.2010, 20:18
  • 4
    @phunehehe, @Steven: mpg321 не имеет никакого отношения к нему, это - оболочка, из которой это разбивает вывод find в отдельные аргументы. И -print0 | xargs -0 будет работать с каждым возможным именем файла. –  Gilles 'SO- stop being evil' 01.10.2010, 21:53
find /music -iname "*\.mp3" -exec mpg123 {} +

С GNU находят, можно также использовать -print0 и xargs -0, но существует мало точки в изучении еще одного инструмента. -exec ... {} + синтаксис получает мало упоминания, потому что Linux получил его позже, чем -print0, но нет никакой причины не использовать его теперь.

С zsh или ударом 4, это намного более просто:

mpg123 **/*.[Mm][Pp]3

В zsh только, можно сделать (часть a) шаблон нечувствительный к регистру:

mpg123 (#i)**/*.mp3
8
27.01.2020, 19:57
  • 1
    +1 к этому, "находят-print0", является ужасным взломом. –  p-static 02.10.2010, 09:04

Я думаю, что решение Steven является лучшим, но иначе состоит в том, чтобы использовать xargs' -I флаг, который позволяет Вам указать строку, которая будет затем заменена в команде с аргументом (вместо того, чтобы просто добавить аргумент на конец команды). Можно использовать это для заключения в кавычки аргумента:

find /music -iname "*\.mp3" | xargs -0 -Ifoo mpg321 "foo"
2
27.01.2020, 19:57
  • 1
    , я не понимаю этот ответ... Вы используете xargs's -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 для выполнения, и никаких проблем не возникнет.

0
27.01.2020, 19:57

Обычно лучше напрямую -exec $ {tgt_process} \ {\} + , но если вы это делаете , необходимо получить список имен файлов с надежными разделителями в файле или потоке. из найдите по какой-либо причине, тогда вы можете сделать следующее:

find -exec sh -c 'printf "///%s///\n" "$@"' -- \{\} +

Вы получите две уникальные строки. В начале каждого имени файла находится строка \ n /// , а в конце каждого файла находится строка /// \ n . Эти две строки больше нигде в выводе find не встречаются, за исключением этих позиций, независимо от того, какие символы содержат имена файлов.

Кроме того, вышеупомянутое использование является базовой переносимостью POSIX, и на него можно положиться практически в любой системе Unix. Это не относится к использованию разделителя нулевого байта, несмотря на его удобство, рекомендованного некоторыми другими.

Но, опять же, это необходимо только в том случае, если вы не можете напрямую -exec свой $ tgt_process по какой-либо причине, поскольку это должно быть вашей целью. Во-первых, вышеупомянутый метод все еще требует синтаксического анализа. Например, если вы хотите, чтобы каждое имя файла было процитировано оболочкой, вам сначала нужно убедиться, что все жесткие кавычки в имени файла были экранированы:

find ... + | sed 's|'\''|&"&"&|g;s|///|'\''|g'

Это выводит правильно экранированный оболочкой массив имен файлов, независимо от того, какими бы они ни были составляющие символы . Теперь вам остается только надеяться, что ваше приложение на принимающей стороне не испортит его.

1
27.01.2020, 19:57

Теги

Похожие вопросы