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

Joh*_*ohn 2 bash find xargs

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

在 linux 中递归使用 SED?

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

我决定更多地了解find,xargssed语句。在 bash 版本 4.4.20(1)-release 的 Ubuntu 18.04 上,我可以将语句简化为:

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国旗find,并xargs分别?-print完全放弃标志有什么缺点吗?它们是否明确用于与不同的类 Unix 系统兼容?

Gor*_*son 6

不使用的版本-print0,并xargs -0会在文件名中的一些罕见的,但是合法的字符,包括空格,制表符,换行符,引号,和反斜杠会感到困惑。零字节(ASCII NUL 字符)是文件路径中唯一不能出现的东西,因此将其用作分隔符可以避免这些潜在问题。

但其实还有更简单的方法。现代版本find有一个-exec ... +主要的,做基本上是相同的东西xargs,直接在find命令:

find . -type f -exec sed -i 's/regex_search_term/replace_term/g' {} +
Run Code Online (Sandbox Code Playgroud)

它没有所有的选项xargs,所以如果你需要一些不同于通常的收集名称并运行它的东西,你仍然应该使用-print0 | xargs -0.