基本名称不适用于xargs占位符

时间:2019-07-09 07:54:40

标签: bash shell unix

我正尝试在basename的{​​{1}}中使用xargs实用程序,如下所示:

printf

这里printf "%s" "$ACTUAL_FILES" | xargs -d ' ' -i printf "%s\n" "$(basename {})" 是一个绝对文件路径的数组,每个文件路径都用空格分隔。

使用上面的代码片段,我试图在每行中打印不带路径的文件名。但是我得到的输出与$ACTUAL_FILES中的输出相同,每个行中都有每个元素。

我知道我们可以使用$ACTUAL_FILESbash sub shellecho来实现这一点,但是我被告知要使用xargsprintf

如何使用基本名称或任何其他实用程序获取文件名。

2 个答案:

答案 0 :(得分:2)

您需要在处理xargs之后删除路径(我用小写形式写了您的var):

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

以换行符代替空格开始时,处理会更容易。

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

您可以避免tr

grep -Eo "[^/]*( |$)" <<< "${actual_files}"

答案 1 :(得分:0)

xargs将参数直接发送到命令。当xargs生成参数并将其发送到命令时,不再需要任何shell干预。使用xargs不能使用子shell调用($(..))。您可以在将它们发送到xargs之前进行准备,或者可以让xargs制作一个shell,而您可以在其中使用所有shell功能。

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

如果可以使用,则GNU parallel在构建命令时具有更多功能。

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

在这里{/}自动是输入参数的基本名称,-q保留使用的引号。