Bash

帶有就地編輯的 Sed 更改文件的組所有權

  • August 1, 2018

我有php以這種方式與目標文件聯繫的 shell ( ) 腳本:

  • 檢查文件和目錄是否可以用php‘s寫入is_writable()(我認為這不是問題)
  • sed使用命令進行就地文件編輯:

grep -q "$search" "$passwd_file" && { sed -i "s|$search|$replace|" "$passwd_file"; printf "Password changed!\n"; } || printf "Password not changed!\n"

結果,我得到了(其他一切都正確,但是)文件應該myuser:www-datamyuser:myuser.

是否會sed更改文件組的所有權,如果可能的話,我該如何避免?

sed就地編輯模式有一點問題-ised在同一目錄中創建一個名為 的臨時文件sedy08qMA,其中y08qMA是一個隨機生成的字元串。該文件填充了原始文件的修改內容。操作完成後,sed刪除原始文件並將臨時文件重命名為原始文件名。所以這不是真正的就地編輯。它創建一個具有呼叫使用者權限的新文件和一個新的 inode 號。這種行為大多還不錯,但例如,硬連結會被破壞。

但是,如果您想要真正的就地編輯,您應該使用ed. 它從標準輸入讀取命令並直接編輯文件,沒有臨時文件(它在ed的記憶體緩衝區上完成)。一種常見的做法是使用printf來生成命令列表:

printf "%s\n" '1,$s/search/replace/g' wq | ed -s file

printf命令產生如下輸出:

1,$s/search/replace/g
wq

這兩行是ed命令。第一個搜尋字元串search並將其替換為replace. 第二個將 ( w) 更改寫入文件並退出 ( q)。-s抑制診斷輸出。

引用自:https://unix.stackexchange.com/questions/276651