Базовое имя не работает с заполнителем xargs - PullRequest
1 голос
/ 09 июля 2019

Я пытаюсь использовать утилиту basename в xargs по трубопроводу от printf, как показано ниже:

printf "%s" "$ACTUAL_FILES" | xargs -d ' ' -i  printf "%s\n" "$(basename {})"

Здесь $ACTUAL_FILES - массив абсолютных путей к файлам, каждый из которых разделен пробелом.

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

Я знаю, что мы можем достичь этого с помощью bash sub shell и echo с xargs, но мне сообщили, что можно использовать printf с xargs.

Как я могу использовать basename или любую другую утилиту для получения имени файла.

Ответы [ 2 ]

2 голосов
/ 09 июля 2019

Вам нужно убрать путь после обработки xargs (я пишу вашу переменную в нижнем регистре):

printf "%s" "${actual_files}" | xargs -d ' ' -i  printf "%s\n" "{}" | sed 's#.*/##'

Обработка может быть проще, если вы начнете с замены пробелов символами новой строки.

tr ' ' '\n' <<< "${actual_files}"| sed 's#.*/##'

Вы можете избежать tr с

grep -Eo "[^/]*( |$)" <<< "${actual_files}"
0 голосов
/ 09 июля 2019

xargs отправляет ваши аргументы непосредственно в команду.Больше нет вмешательства оболочки, когда xargs делает аргументы и отправляет их команде.Используя xargs, вы не можете использовать вызов subshell ($(..)).Вы можете либо подготовить их перед отправкой в ​​xargs, либо позволить xargs создать оболочку, в которой вы можете использовать все функции оболочки.

printf "%s" "$ACTUAL_FILES" | xargs -d ' ' -i  bash -c 'printf "%s\n" "$(basename {})"'

Если вы можете использовать, параллельная GNU имеет гораздо больше возможностей для построения команды.

printf "%s" "$ACTUAL_FILES" | parallel -q printf "%s\n" "{/}"

Здесь {/} автоматически является базовым именем входных аргументов, а -q сохраняет используемое цитирование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...