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