咨询find命令-exec选项中{}替换规则及版本差异
关于find命令-exec中{}替换逻辑的差异说明
核心差异概述
当前主流的GNU find(如Linux系统默认版本)会替换-exec参数列表中所有出现的{},无论它是否单独作为一个参数。而部分旧版本或非GNU系的find(如早期BSD版本、部分传统Unix版本)则遵循严格规则:仅当{}完全单独成为一个命令参数时,才会将其替换为匹配的文件名;如果{}和其他字符拼接在同一个参数里,会被当作普通字符串处理,不会替换。
示例对比
假设当前目录下存在文件test.txt,以下是两种行为的具体示例:
1. {}与其他字符同属一个参数
执行命令:
find . -name "test.txt" -exec echo "当前文件:{}" \;
- 主流GNU find输出:
这里当前文件:./test.txt{}虽和其他字符串在同一个参数内,但仍被正常替换为匹配的文件名。 - 旧版本find输出:
由于当前文件:{}{}不是单独的参数,不会被替换,直接保留原字符串。
2. {}单独作为参数
执行命令:
find . -name "test.txt" -exec ls -l {} \;
两种版本的find都会正常替换,输出:
-rw-r--r-- 1 user user 0 Aug 10 10:00 ./test.txt
因为{}是单独的命令参数,符合旧版本find的替换规则。
3. 混合场景(部分{}单独,部分拼接)
执行命令:
find . -name "test.txt" -exec cp {} {}.bak \;
- 主流GNU find会将两个
{}都替换,实际执行的命令是:
成功生成cp ./test.txt ./test.txt.baktest.txt.bak备份文件。 - 旧版本find仅替换第一个单独的
{},第二个{}因和.bak拼接成一个参数,不会被替换,实际执行的命令是:
这会尝试将文件复制到名为cp ./test.txt {}.bak{}.bak的文件中,而非预期的备份文件。
手册语句解读
find手册中提到的“并非像部分find版本那样仅在{}单独作为参数时才替换”,正是明确当前版本(GNU find)取消了旧版本的限制,允许{}在任意参数位置被替换,提升了命令的灵活性。
内容的提问来源于stack exchange,提问作者Polaris W.L
相关产品推荐
相关产品推荐

