在 bash 中,如果尝试在选项basename
内运行该函数,它似乎不会执行任何操作。例如:-exec
find
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 {})'
。这是错误的,请参阅另一个答案。