find -name "*.c" -exec echo $(basename {}) \;
basename
似乎无能为力。它只是返回整个路径。
答案 0 :(得分:5)
$(basename {})
开始之前评估 find
:您告诉shell使用basename {}
的结果来构造find
命令行。基本上它确实如此:
$(basename {})
评估为{}
find -name "*.c" -exec echo {} \;
find
构造所有-exec
个命令;例如。 echo /path/to/file
这就是为什么你只有整条道路。
为了实现你想要的,这是一个例子:
find . -name "*.c" -exec basename {} \;
请注意,我已将起始路径添加到find
,否则它不可移植。
更新:此答案在下面的评论中显示了来自@chepner的示例。我之前的例子无缘无故太复杂了。
答案 1 :(得分:2)
Jean-Sébastien Pédron's helpful answer:
使用最有效的解决方案补充它:
使用-exec ... +
以便同时传递适合单个命令行的匹配路径,通常只会导致单个调用指定的实用程序:
find . -name "*.c" -exec basename -a {} +
请注意,虽然允许多个文件名传递的basename -a
不符合POSIX标准,但它在Linux和BSD / OSX上都受支持。