哈嘍大家好,我是咸魚vXl28資訊網——每日最新資訊28at.com
vXl28資訊網——每日最新資訊28at.com
在文章《三劍客之 sed》中咸魚向大家介紹了文本三劍客中的 sedvXl28資訊網——每日最新資訊28at.com
vXl28資訊網——每日最新資訊28at.com
sed 全名叫 stream editor,流編輯器,用程序的方式來編輯文本vXl28資訊網——每日最新資訊28at.com
vXl28資訊網——每日最新資訊28at.com
那么今天咸魚打算講一下我在用 sed 原地替換文件時遇到的趣事vXl28資訊網——每日最新資訊28at.com
vXl28資訊網——每日最新資訊28at.com
vXl28資訊網——每日最新資訊28at.com
sed 讓文件屬性變了?
vXl28資訊網——每日最新資訊28at.com
有這么一個普通文件 test.txt ,內容如下:vXl28資訊網——每日最新資訊28at.com
圖片vXl28資訊網——每日最新資訊28at.com
vXl28資訊網——每日最新資訊28at.com
link_test.txt 是一個軟鏈接(Symbolic Link,也可以叫符號鏈接)文件,指向 test.txt 文件vXl28資訊網——每日最新資訊28at.com
圖片vXl28資訊網——每日最新資訊28at.com
vXl28資訊網——每日最新資訊28at.com
軟鏈接文件類似于 Windows 的快捷方式,它實際上是一個特殊的文件。關于軟鏈接相關的內容這里不過多介紹vXl28資訊網——每日最新資訊28at.com
vXl28資訊網——每日最新資訊28at.com
如果我們對軟鏈接文件內容進行修改,源文件是會跟著改變的vXl28資訊網——每日最新資訊28at.com
圖片vXl28資訊網——每日最新資訊28at.com
vXl28資訊網——每日最新資訊28at.com
當我使用 sed 對軟鏈接文件 link_test.txt 進行內容修改時,命令如下vXl28資訊網——每日最新資訊28at.com
圖片vXl28資訊網——每日最新資訊28at.com
vXl28資訊網——每日最新資訊28at.com
有趣的現象發生了:使用 sed 對軟鏈接文件 link_test.txt 進行內容修改之后,源文件 test.txt 內容沒有變化,軟鏈接文件link_test.txt 的內容發生變化且變成了普通文件vXl28資訊網——每日最新資訊28at.com
圖片vXl28資訊網——每日最新資訊28at.com
vXl28資訊網——每日最新資訊28at.com
怎么樣,是不是很神奇?sed 不但把文件內容改了,還把文件屬性也給改了vXl28資訊網——每日最新資訊28at.com
vXl28資訊網——每日最新資訊28at.com
我們用 strace 工具來查看一下在執行 sed 命令時操作系統做了哪些操作vXl28資訊網——每日最新資訊28at.com
vXl28資訊網——每日最新資訊28at.com
vXl28資訊網——每日最新資訊28at.com
strace 一個系統調用跟蹤工具,它會跟蹤并記錄命令運行期間的系統調用和信號vXl28資訊網——每日最新資訊28at.com
vXl28資訊網——每日最新資訊28at.com
vXl28資訊網——每日最新資訊28at.com
圖片vXl28資訊網——每日最新資訊28at.com
vXl28資訊網——每日最新資訊28at.com
具體內容有點多,我們著重看下關鍵內容vXl28資訊網——每日最新資訊28at.com
圖片vXl28資訊網——每日最新資訊28at.com
vXl28資訊網——每日最新資訊28at.com
由上圖可以知道,如果我們使用 sed 對一個文件進行原地替換,需要有一個臨時文件,sed 先把修改內容寫入到這個文件,最后將文件 rename 到原來的地方vXl28資訊網——每日最新資訊28at.com
vXl28資訊網——每日最新資訊28at.com
那我的需求是對軟鏈接文件 link_test.txt 進行內容修改,軟鏈接文件屬性不變,且源文件的內容也跟著改變,有沒有什么方法呢?vXl28資訊網——每日最新資訊28at.com
vXl28資訊網——每日最新資訊28at.com
也就是說我們希望命令在執行的時候能夠解析出來軟鏈接文件后面指向的源文件,直接對源文件進行讀--處理--寫,最后 renamevXl28資訊網——每日最新資訊28at.com
vXl28資訊網——每日最新資訊28at.com
sed 命令有一個選項 --follow-symlinksvXl28資訊網——每日最新資訊28at.com
圖片vXl28資訊網——每日最新資訊28at.com
vXl28資訊網——每日最新資訊28at.com
我們在執行的時候加上這個選項:vXl28資訊網——每日最新資訊28at.com
圖片vXl28資訊網——每日最新資訊28at.com
vXl28資訊網——每日最新資訊28at.com
圖片vXl28資訊網——每日最新資訊28at.com
vXl28資訊網——每日最新資訊28at.com
總結一下:vXl28資訊網——每日最新資訊28at.com
- sed 替換的底層邏輯是把更新后的內容寫入一個臨時文件里面,然后再 rename 這個臨時文件
- 這樣就會使得如果沒有添加 –follow-symlinks 選項的話,對軟鏈接文件進行 sed 操作就會使得軟鏈文件變成了一個常規文件(其實是那個臨時文件重命名導致的)
- 如果要對軟鏈接文件指向的源文件進行操作,就需要添加 –follow-symlinks 選項
本文鏈接:http://www.www897cc.com/showinfo-26-16938-0.htmlSed 原地替換文件時遇到的趣事
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 【技術革命】JDK21虛擬線程來襲,讓系統的吞吐量翻倍!
下一篇: 通過研究案例,徹底掌握Python GIL