如何在 Unix 中使用 find 打印基本文件名?

rec*_*ach 2 find

我一直在尝试使用 Unix 中的 find 打印出基本文件名。简单地打印出我一直使用的命令的文件名是这个

find . -type f -name \*.out -print
Run Code Online (Sandbox Code Playgroud)

它打印出完整路径限定的路径名​​。但我只想要基本文件名。这就是为什么我一直在尝试以下命令

find . -type f -name \*.out -exec basename {}
Run Code Online (Sandbox Code Playgroud)

但它出错并显示

find: incomplete statement
Run Code Online (Sandbox Code Playgroud)

请帮我度过难关。

cuo*_*glm 8

您缺少;终止主表达式的字符(请参阅POSIX find):

find . -type f -name \*.out -exec basename {} ';'
Run Code Online (Sandbox Code Playgroud)

您必须转义或引用的;原因,因为它是您的 shell 列表分隔符。你必须让你的外壳按字面意思对待它。\;';'";"一切正常。

但是这个解决方案会调用basename找到的每个文件,让它变慢。如果文件名不包含换行符,您可以:

find . -type f -name '*.out' | sed -e 's#.*/##'
Run Code Online (Sandbox Code Playgroud)

如果您的GNU coreutils 版本 >= 8.16,或者您使用的是 OSX,则可以使用basename -a

find . -type f -name '*.out' -exec basename -a -- {} +
Run Code Online (Sandbox Code Playgroud)


Cel*_*ada 5

您的命令末尾缺少分号,以终止-exec

find . -type f -name \*.out -exec basename {} \;
Run Code Online (Sandbox Code Playgroud)

但是该命令会运行得很慢,因为它会派生一个外部进程并调用basename每个匹配项。如果您的 find 支持该-printf选项,您可能想改用它:

find . -type f -name \*.out -printf '%f\n'
Run Code Online (Sandbox Code Playgroud)

  • 至于为什么需要它,手册页中清楚地记录了这一点。请阅读。这就是 `find` 如何知道你的命令在哪里结束。至于为什么需要转义,它是一个shall 元字符。 (2认同)