我一直在尝试使用 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)
请帮我度过难关。
您缺少;
终止主表达式的字符(请参阅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)
您的命令末尾缺少分号,以终止-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)
归档时间: |
|
查看次数: |
9554 次 |
最近记录: |