从 find 和 xargs 中删除 -print0 和 -0 标志

从 find 和 xargs 中删除 -print0 和 -0 标志

大约 10 年前,我问过这个问题

在 Linux 中递归使用 SED?

并得到这个有用的命令find . -type f -print0 | xargs -0 sed -i 's/regex_search_term/replace_term/g'

我决定进一步了解find, xargsandsed语句。在 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 系统兼容?findxargs-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

相关内容