find查找文件执行sed替换后与原文件diff对比命令报错问题
报错原因
- 语法解析优先级问题:shell会先解析管道符
|,不会将管道后的diff部分识别为-exec的参数,原命令被直接拆成两段执行:前半段是不完整的find命令,后半段是参数无效的diff命令,{}没有被find替换为实际文件名,末尾的\;被当成diff的多余参数,因此触发diff: extra operand ';'报错。 sed命令语法残缺:替换规则s/Cow/Kitten缺少结尾的分隔符/,正确写法应为s/Cow/Kitten/,需要全局替换可加g参数改为s/Cow/Kitten/g。-exec终止符位置错误:find的-exec参数要求终止符\;必须紧跟在待执行命令的末尾,被管道隔开后find无法识别到终止符,因此触发find: missing argument to -exec报错。
最优实现方式
方式1:-exec嵌套子shell执行
将替换+对比逻辑都封装到sh子shell中,保证逻辑在-exec的作用范围内执行,兼容特殊文件名:
find . -type f -name "names.*" -exec sh -c 'sed "s/Cow/Kitten/g" "$1" | diff "$1" -' sh {} \;
方式2:循环遍历匹配文件
可读性更高,更容易扩展修改逻辑,处理带空格的文件名可使用-print0+read的写法:
find . -type f -name "names.*" -print0 | while IFS= read -r -d '' file; do sed 's/Cow/Kitten/g' "$file" | diff "$file" - done
内容的提问来源于stack exchange,提问作者Bob R
相关产品推荐
相关产品推荐

