我正尝试在basename
的{{1}}中使用xargs
实用程序,如下所示:
printf
这里printf "%s" "$ACTUAL_FILES" | xargs -d ' ' -i printf "%s\n" "$(basename {})"
是一个绝对文件路径的数组,每个文件路径都用空格分隔。
使用上面的代码片段,我试图在每行中打印不带路径的文件名。但是我得到的输出与$ACTUAL_FILES
中的输出相同,每个行中都有每个元素。
我知道我们可以使用$ACTUAL_FILES
和bash sub shell
和echo
来实现这一点,但是我被告知要使用xargs
和printf
。
如何使用基本名称或任何其他实用程序获取文件名。
答案 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保留使用的引号。