大约 10 年前,我问过这个问题
并得到这个有用的命令find . -type f -print0 | xargs -0 sed -i 's/regex_search_term/replace_term/g'
我决定进一步了解find
, xargs
andsed
语句。在 Ubuntu 18.04 的 bash 版本 4.4.20(1)-release 中,我可以将语句简化为:
find . -type f -print | xargs sed -i 's/regex_search_term/replace_term/g'
然后可以再次简化为:
find . -type f | xargs sed -i 's/regex_search_term/replace_term/g'
所以我的问题是,不使用和-print0
标志 有什么缺点吗?完全放弃-0
标志有什么缺点吗?它们是否明确用于与不同的类 unix 系统兼容?find
xargs
-print
答案1
-print0
不使用的版本xargs -0
会被文件名中的一些罕见但合法的字符所混淆,包括空格、制表符、换行符、引号和反斜杠。零字节(ASCII NUL 字符)是唯一不能出现在文件路径中,因此使用它作为分隔符可以避免这些潜在的问题。
但实际上有一种更简单的方法。的现代版本find
有一个-exec ... +
主函数,它的功能与 基本相同xargs
,直接在find
命令中执行:
find . -type f -exec sed -i 's/regex_search_term/replace_term/g' {} +
它不具备所有的选项xargs
,所以如果您需要除了通常的 collect-names-and-run-it 之外的其他东西,您仍然应该使用-print0 | xargs -0
。