为什么basename不能在find中执行?

dra*_*tis 1 unix shell

find -name "*.c" -exec echo $(basename {}) \;
Run Code Online (Sandbox Code Playgroud)

basename似乎什么都不做.它只返回整个路径.

Jea*_*ron 5

$(basename {})在find开始之前进行评估:告诉shell使用结果basename {}来构造find命令行.基本上它确实如此:

  1. $(basename {}) 评估为 {}
  2. 呼叫 find -name "*.c" -exec echo {} \;
  3. find构造所有-exec命令; 例如.echo /path/to/file

这就是为什么你只有整个路径.

为了实现你想要的,这是一个例子:

find . -name "*.c" -exec basename {} \;
Run Code Online (Sandbox Code Playgroud)

请注意,我添加了起始路径find,否则它不可移植.

更新:这个答案在下面的评论中显示了@chepner的一个例子.我之前的例子没有任何理由太复杂了.