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

5 bash shell find basename

这不起作用:

find "$all_locks" -mindepth 1 -maxdepth 1 -type d | basename
Run Code Online (Sandbox Code Playgroud)

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

Pet*_*llo 11

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

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

在这种情况下,这意味着它将从您的find命令中获取每个结果并运行basename <find result>ad nauseum,直到 find 完成其搜索。我相信你想要的看起来很像这样:

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


sus*_*enj 6

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

find -mindepth 1 -maxdepth 1 -type d -exec basename {}  \;
Run Code Online (Sandbox Code Playgroud)

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

  • 在 ubuntu bash 4 上,我得到 `find: Missing argument to '-exec'`...奇怪 (2认同)
  • @MrCholo,我希望你没有错过 `{}` 和 \ 之间的空格?因为,我可以通过删除该空间来重现您的问题。 (2认同)

ogu*_*ail 6

由于mindepthmaxdepth是 GNU 扩展,因此使用另一个扩展(例如 )printf不会降低其可移植性。

find "$all_locks" -mindepth 1 -maxdepth 1 -type d -printf '%f\n'
Run Code Online (Sandbox Code Playgroud)