Использование подстановки команд в find -exec - PullRequest
0 голосов
/ 23 апреля 2020

Как я могу использовать подстановку команд в find … -exec …, чтобы избежать использования xargs в следующей команде?

find -L -- /path/to/directory -mindepth 2 -maxdepth 2 -type d -exec dirname '{}' \; | xargs basename -a

Я попробовал следующее, используя подстановку команд, но для каждого результата выдается . вместо желаемого выхода:

find -L -- /path/to/directory -mindepth 2 -maxdepth 2 -type d -exec basename "$(dirname '{}')" \;

1 Ответ

1 голос
/ 23 апреля 2020

Ваша первая команда выдаст странные результаты, если путь содержит пробелы.

Используйте небольшой сценарий оболочки:

find -L -- . -mindepth 2 -maxdepth 2 -type d -exec sh -c 'basename "$(dirname "{}")"' \;

Альтернативный синтаксис для передачи одного аргумента пути в сценарий:

find -L -- . -mindepth 2 -maxdepth 2 -type d -exec sh -c 'basename "$(dirname "$1")"' sh {} \;

Или передать в сценарий столько аргументов, сколько возможно:

find -L -- . -mindepth 2 -maxdepth 2 -type d -exec sh -c '
  for path do
    basename "$(dirname "$path")"
  done
' sh {} +

С помощью утилит GNU можно выводить строки с NUL-окончанием, при этом dirname передается xargs -0. Команда basename не запускается, если нет аргументов (-r):

find -L -- . -mindepth 2 -maxdepth 2 -type d -exec dirname -z {} + | xargs -r0 basename -a
...