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

时间:2016-03-25 17:43:30

标签: shell unix

find -name "*.c" -exec echo $(basename {}) \;

basename似乎无能为力。它只是返回整个路径。

2 个答案:

答案 0 :(得分:5)

$(basename {})开始之前评估

find:您告诉shell使用basename {}的结果来构造find命令行。基本上它确实如此:

  1. $(basename {})评估为{}
  2. 致电find -name "*.c" -exec echo {} \;
  3. find构造所有-exec个命令;例如。 echo /path/to/file
  4. 这就是为什么你只有整条道路。

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

    find . -name "*.c" -exec basename {} \;
    

    请注意,我已将起始路径添加到find,否则它不可移植。

    更新:此答案在下面的评论中显示了来自@chepner的示例。我之前的例子无缘无故太复杂了。

答案 1 :(得分:2)

Jean-Sébastien Pédron's helpful answer

  • 解释了您的解决方案尝试的问题。
  • 包含最符合POSIX标准的解决方案。

使用最有效的解决方案补充它:

使用-exec ... +以便同时传递适合单个命令行的匹配路径,通常只会导致单个调用指定的实用程序:

find . -name "*.c" -exec basename -a {} +

请注意,虽然允许多个文件名传递的basename -a不符合POSIX标准,但它在Linux和BSD / OSX上都受支持。