find命令-exec选项中{}{,suffix}语法的作用原理咨询
关于
find -exec中{}{,bar}语法的原理解析 这两个命令之所以等效,核心是用到了Shell大括号扩展和find命令的{}替换规则,拆解如下:
1. find的{}替换逻辑
当find通过-name匹配到目标文件后,会把-exec参数里的{}替换为当前匹配到的文件的完整路径(或文件名,取决于查找范围)。比如找到文件test01,{}就会被替换成test01。
2. {}{,bar}的大括号扩展原理
{,bar}是Shell的大括号扩展语法,它会把自身展开成两个内容:空字符串和bar。所以{}{,bar}会被Shell先解析成{} {}bar——这和你第一个命令里mv的两个参数完全一致。
3. 执行顺序的关键
整个命令的执行流程是:
- Shell先对命令行进行预处理,识别到
{,bar}后完成大括号扩展,把find . -name '*01' -exec mv {}{,bar} \;转换成find . -name '*01' -exec mv {} {}bar \;。 - 之后
find命令才开始执行,对每个匹配文件替换{},最终执行的mv命令和第一个写法完全相同。
注意事项
这个写法依赖于Shell对大括号扩展的支持(比如Bash、Zsh默认都支持),如果用不支持大括号扩展的Shell(比如POSIX标准的sh)执行,{,bar}会被当成字面量,导致mv接收到错误的参数(比如mv test01 test01{,bar}),命令会失效。
内容的提问来源于stack exchange,提问作者deevroman
相关产品推荐
相关产品推荐

