Mac OS X终端执行批量替换命令遇报错,求最优实现方案
在Mac终端批量替换文件名和内容中的字符
首先,你遇到的find: -readable: unknown primary or operator错误是因为Mac使用的是BSD版本的find,而-readable、-writable是GNU find的扩展参数,BSD find并不支持。下面分两步解决你的需求:批量替换文件内容,以及批量替换文件名。
1. 批量替换文件内容中的"A"为"B"
我们用-perm -u+rw替代原来的权限检查参数(表示当前用户对文件拥有读写权限),同时调整sed的参数——Mac的BSD sed要求-i后面必须指定备份后缀(空字符串表示不生成备份文件)。
执行命令:
find ./ -type f -perm -u+rw -exec sed -i '' "s/A/B/g" {} \;
- 如果你想保留原文件的备份(比如生成
.bak后缀的备份),可以把命令改成:find ./ -type f -perm -u+rw -exec sed -i '.bak' "s/A/B/g" {} \; - 测试建议:先执行
find ./ -type f -perm -u+rw -print查看匹配的文件列表,确认无误后再执行替换命令。
2. 批量替换文件名中的"A"为"B"
Mac默认没有GNU的rename工具,我们用find结合mv来实现,借助Shell的参数替换功能完成字符串替换:
执行命令:
find ./ -type f -name "*A*" -exec sh -c 'mv "$0" "${0//A/B}"' {} \;
- 如果你还需要替换目录名中的"A",可以去掉
-type f参数,同时加上-depth确保先处理深层目录/文件,避免因上层目录改名导致找不到下层内容:find ./ -depth -name "*A*" -exec sh -c 'mv "$0" "${0//A/B}"' {} \; ${0//A/B}表示把文件名中的所有"A"替换成"B",如果只需要替换第一个"A",改成${0/A/B}即可。
注意事项
- 如果"A"或"B"包含特殊字符(比如
/、"、空格),需要进行转义:比如替换/时,sed可以改用其他分隔符,如sed -i '' "s#/old#/new#g";文件名中的空格会被"$0"自动处理,无需额外转义。 - 建议先在测试目录中验证命令效果,避免误修改重要文件。
内容的提问来源于stack exchange,提问作者Gabriel Balza
相关产品推荐
相关产品推荐

