如何通过管道查找路径的基本名称

问题描述 投票:0回答:3

这不起作用:

find "$all_locks" -mindepth 1 -maxdepth 1 -type d | basename

显然,basename 无法从 stdin 读取 - 在任何情况下,basename 都需要至少一个参数。

bash shell find basename
3个回答
32
投票

要将命令应用于管道操作的每个结果,xargs 是你的朋友。正如我链接的手册页上所说...

xargs 从标准输入中读取项目,以空格分隔(其中 可以用双引号或单引号或反斜杠保护)或 换行符,并执行命令(默认为/bin/echo)一个或多个 带有任何初始参数的时间,后跟从标准读取的项目 输入。

在这种情况下,这意味着它将从

find
命令获取每个结果并运行
basename <find result>
,直到 find 完成搜索。我相信你想要的看起来很像这样:

find "$all_locks" -mindepth 1 -maxdepth 1 -type d | xargs basename


7
投票

使用 GNU 查找:

find "$all_locks" -mindepth 1 -maxdepth 1 -type d -printf '%f\n'

6
投票

这里的问题是

basename
不接受
stdin
,因此未命名的管道可能没有用。我想稍微修改一下你的命令。让我知道它是否达到目的。

find -mindepth 1 -maxdepth 1 -type d -exec basename {}  \;

注意:没有足够的声誉来发表评论,因此将其发布在这里。

© www.soinside.com 2019 - 2024. All rights reserved.