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

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

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

find . -type f -name \*.out -print

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

find . -type f -name \*.out -exec basename {}

但它出错并显示

find: incomplete statement

请帮我渡过难关。

答案1

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

find . -type f -name \*.out -exec basename {} ';'

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

但此解决方案将调用basename找到的每个文件,使其变慢。如果文件名不包含换行符,您可以:

find . -type f -name '*.out' | sed -e 's#.*/##'

如果你有GNU coreutils 版本 >= 8.16,或者您在 OSX 上,您可以使用基本名称-a:

find . -type f -name '*.out' -exec basename -a -- {} +

答案2

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

find . -type f -name \*.out -exec basename {} \;

但该命令运行速度会相当慢,因为它会分叉一个外部进程并调用basename每个匹配项。如果您的发现支持该-printf选项,您可能想使用它:

find . -type f -name \*.out -printf '%f\n'

答案3

你离开了\;

 find . -type f -name \*.out -exec basename {} \;

如果您的文件路径不包含换行符,您还可以使用awk

find . -type f -name \*.out -print | awk -F "/" '{print $NF}'

相关内容