我一直在尝试使用 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}'