Как использовать xargs с поиском BSD?

С GNU find легко подключиться к xargs. Типичный (бесполезный) пример:

find /var/log -name "*.log" | xargs dirname

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

Эта же команда с BSD find не работает, заканчиваясь:

usage: dirname path

То есть xargs не может передать записи списка файлов dirname.

На странице руководства BSD find упоминаются параметры -exec и -execdir, в которых говорится: «Это поведение похоже на поведение xargs (1)».

-exec утилита [аргумент ...] {} + То же, что и -exec, за исключением того, что ``{}'' заменяется как можно большим количеством путей для каждого вызова утилиты. Это поведение похоже на поведение xargs(1).

-execdir утилита [аргумент ...] {} + То же, что и -execdir, за исключением того, что ``{}'' заменяется как можно большим количеством путей для каждого вызова утилиты. Это поведение похоже на поведение xargs(1).

Каждый раз, когда я возвращаюсь к этим двум флагам, мне приходится снова читать документацию. Кажется, я не могу вспомнить их использование! Кроме того, меня беспокоит переносимость сценариев между системами GNU/BSD, в основном Linux, Open/FreeBSD и MacOS.

Любой способ передать BSD find в xargs, или -exec действительно единственный вариант?


person Eric Platon    schedule 27.11.2018    source источник


Ответы (1)


Обе версии xargs для GNU и FreeBSD поддерживают способ передачи строк из стандартного ввода в команду как часть флага -I. Все, что вам нужно, это

find /var/log -name "*.log" | xargs -I {} dirname -- "{}"

На странице GNU xargs говорится о флаге как

-I replace-str Замените вхождения replace-str в начальных аргументах именами, считанными из стандартного ввода.

Это обеспечивает альтернативный способ использования -exec или -execdir. Однако, сказав, что использование -exec не слишком сложно для вашего случая.

find /var/log -name "*.log" -type f -exec dirname "{}" \;
person Inian    schedule 27.11.2018