Как использовать XARGS с BSD найти? - PullRequest
0 голосов
/ 27 ноября 2018

С 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 действительноединственный вариант?

1 Ответ

0 голосов
/ 27 ноября 2018

Как версия GNU, так и FreeBSD xargs поддерживают способ передачи строк из stdin в команду как часть флага -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 "{}" \;
...