Bash

從 find 和 xargs 中刪除 -print0 和 -0 標誌

  • December 7, 2019

差不多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什麼缺點嗎?完全放棄標誌有什麼缺點嗎?它們是否明確用於與不同的類 Unix 系統兼容?find``xargs``-print

不使用-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.

引用自:https://serverfault.com/questions/994723