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

Shell 为什么basename不在find中执行?,shell,unix,Shell,Unix,basename似乎不起任何作用。它只返回整个路径。$basename{}在find开始之前就被计算了:您告诉shell使用basename{}的结果来构造find命令行。基本上是这样的: $basename{}的计算结果为{} 调用find-name*.c-exec echo{}\; 查找所有-exec命令;例如,echo/path/to/file 这就是为什么你只有整条路 要实现您的目标,以下是一个示例: find -name "*.c" -exec echo $(basename {})

basename似乎不起任何作用。它只返回整个路径。

$basename{}在find开始之前就被计算了:您告诉shell使用basename{}的结果来构造find命令行。基本上是这样的:

$basename{}的计算结果为{} 调用find-name*.c-exec echo{}\; 查找所有-exec命令;例如,echo/path/to/file 这就是为什么你只有整条路

要实现您的目标,以下是一个示例:

find -name "*.c" -exec echo $(basename {}) \;
注意,我添加了要查找的起始路径,否则它不可移植

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

$basename{}在find开始之前就被计算了:您告诉shell使用basename{}的结果来构造find命令行。基本上是这样的:

$basename{}的计算结果为{} 调用find-name*.c-exec echo{}\; 查找所有-exec命令;例如,echo/path/to/file 这就是为什么你只有整条路

要实现您的目标,以下是一个示例:

find -name "*.c" -exec echo $(basename {}) \;
注意,我添加了要查找的起始路径,否则它不可移植

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

很好地解释了解决方案的问题。 包含与POSIX兼容的最佳解决方案。 要用最有效的解决方案来补充它,请执行以下操作:

使用-exec…+以便一次在单个命令行上传递尽可能多的匹配路径,通常只导致对指定实用程序的一次调用:

find . -name "*.c" -exec basename {} \;
请注意,虽然允许传递多个文件名的basename-a不符合POSIX,但它在Linux和BSD/OSX上都受支持。

:

很好地解释了解决方案的问题。 包含与POSIX兼容的最佳解决方案。 要用最有效的解决方案来补充它,请执行以下操作:

使用-exec…+以便一次在单个命令行上传递尽可能多的匹配路径,通常只导致对指定实用程序的一次调用:

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

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

您不需要xargs;只需直接运行basename,而不使用echo:find-name*.c-exec basename{}\;。是的,你完全正确,我不知道为什么我想要这么复杂的线条:-你不需要xargs;只需直接运行basename,而不使用echo:find-name*.c-exec basename{}\;。是的,你完全正确,我不知道为什么我想要这么复杂的线条:-