为什么命令替换在“find”中不起作用?

为什么命令替换在“find”中不起作用?

在 bash 中,如果尝试在选项basename内运行该函数,它似乎不会执行任何操作。例如:-execfind

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

产生包含目录的文件名,即与结果相同

find . -name "*pdf" -exec  echo {} \;

为什么会发生这种情况?

答案1

$(basename {})在执行之前,您的 shell 会解析该代码片段find。结果是{}。这就是两个命令相同的原因。

为了让它按你希望的方式工作,你可以生成另一个可以$()自行处理的 shell。使用 引号可以''防止外壳处理$()

find -name "*pdf" -exec sh -c 'echo $(basename "$1")' sh {} \;

注意:本答案的第一个版本使用了sh -c 'echo $(basename {})'。这是错误的,请参阅另一个答案

相关内容