Command-Line
有沒有辦法讓 perl -i 不破壞符號連結?
我的一個朋友指出,如果你這樣做:
perl -pi.bak -e 's/foo/bar/' somefile
當“somefile”實際上是一個符號連結時,perl 會按照文件所說的那樣做:
它通過重命名輸入文件、按原始名稱打開輸出文件並選擇該輸出文件作為 print() 語句的預設文件來實現這一點。副檔名(如果提供)用於修改舊文件的名稱以製作備份副本
$$ … $$
這會導致一個新的符號連結“somefile.bak”指向未更改的真實文件,以及一個新的、已更改的正常文件“somefile”以及更改。
在許多情況下,遵循符號連結將是所需的行為(即使它使 .bak 文件的正確位置不明確)。除了在包裝器中測試符號連結並適當處理案例之外,是否有一種簡單的方法可以做到這一點?
(
sed
做同樣的事情,因為那是值得的。)
我想知道來自moreutils
sponge
的小型通用實用程序(“吸收標準輸入並寫入文件”)在這種情況下是否會有所幫助,以及它是否會遵循符號連結。作者是這樣描述
sponge
的:它解決了使用 Unix 工具就地編輯文件的問題,即如果您只是將輸出重定向到您嘗試編輯的文件,那麼重定向會在管道中的第一個命令之前生效(破壞文件的內容)輪到從文件中讀取。開關喜歡
sed -i
並perl -i
解決此問題,但並非您可能希望在管道中使用的每個命令都有這樣的選項,並且無論如何您都不能將該方法用於多命令管道。我通常使用海綿有點像這樣:
sed '...' file | grep '...' | sponge file