首页 > 解决方案 > Basename 不适用于 xargs 占位符

问题描述

我正在尝试在管道中使用basename实用程序,如下所示:xargsprintf

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

$ACTUAL_FILES是一个绝对文件路径数组,每个路径用空格分隔。

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

我知道我们可以使用bash sub shelland echowith来实现这一点xargs,但我被告知要使用printfwith xargs

如何使用 basename 或任何其他实用程序来获取文件名。

标签: bashshellunix

解决方案


您需要在处理 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}"

推荐阅读