關於 shell script [論壇 - 新手村]


正在瀏覽:   1 名遊客


 到底部   前一個主題   下一個主題  [無發表權] 請登錄或者註冊



關於 shell script
會員一級
註冊日期:
2017/5/27 21:44
所屬群組:
已註冊使用者
等級: 1
HP : 0 / 15
MP : 2 / 257
EXP: 60
離線
近期常常用到檔案處理的指令,對於文字檔內文的增減最常用到的就是 sed。
考量到前人曾說過的:
「能減少硬碟讀寫就盡量減少,否則會影響硬碟壽命。」

因此我在做數千個檔案批次處理時,已經盡可能地不要重複指令,並試圖以各個變數及陣列做暫存。
然而,每次我執行完一次 shell 後,在 GUI 下重新整理該資料夾,經常會發現多個 "sedXXXXXXX" 的檔案.... (XXXXXX 代指一整串像 hash 過的東西)

基於上面的狀況,雖然再次重新整理就會消失,但我推測我的做法依然會造成硬碟多次讀寫... 應該說,sed 本身就是會用檔案的方式作為暫存?(純屬推測,如果事實並非如此,還請各位前輩不吝指正)

倘若 sed 真的一定會以檔案方式作暫存的話,或許其他指令也會有類似的動作吧,只不過我目前還沒發現而已。
若是這樣,或許我該考慮使用那些傳統的程式語言來迴避多次讀寫硬碟的問題了。

----
但是 shell script 好好用啊,有沒有大神可以跟我說我上面的發現都是幻覺??

----
補充圖檔。更正描述中的一個小錯誤。

附件:



png  擷取.PNG (105.91 KB)
49308_59d1bec1832d7.png 1373X771 px

2017/10/2 11:56
應用擴展 工具箱
回覆: 關於 shell script
會員二級
註冊日期:
2011/10/7 0:22
所屬群組:
已註冊使用者
等級: 7
HP : 0 / 157
MP : 23 / 5263
EXP: 28
離線
我查到了這篇:

sed command creates randomly named files

由其中的討論看來,sed的-i選項,在運作過程中,會先生成一個暫存檔,然後,再把修改的內容存入暫存檔,整個步驟完成後,暫存檔才被更名為原來檔案的檔名(也就是原來檔案的檔名和內容的連結被取代掉)。

至於為何一定要有暫存檔,我目前還沒辦法想得很透徹,只知道在Shell下,如果寫:
cat < foo.txt > foo.txt


則foo.txt裡面本來有的檔案內容會被清空。

好像是開啟一個檔案之後,通常不會一口氣把整個檔案內容讀入記憶體,須要看程式是調用哪種函數,如果是fopen()則會有一個buffer(緩衝)的記憶體空間,每次大概讀入這個buffer(緩衝)大小(在實作上,buffer(緩衝)可能大概應該是被宣告的陣列);而open()則無緩衝。

在檔案內容還沒全部讀入記憶體,就對檔案做開啟然後清空內容的動作,然後再去讀它,最後獲得的就是一個空的內容。

另外,檔案以我目前的理解來說是一連串連續的資料,如果要在中間安插內容,等於要把在安插點之後的資料整個做平移。(或許說不定這可能取決於檔案系統的設計,比如說,如果資料是存在一個一個小方格,而安插的大小剛好等於方格,或小於方格,這樣在描述檔案的資料再多一筆指向那個方格的資料,接著給與順序編號及重排編號,或許就不用平移,但以上是假想,目前的檔案系統應該不是這樣。)

2017/10/2 20:59
應用擴展 工具箱


 [無發表權] 請登錄或者註冊


可以查看帖子.
不可發帖.
不可回覆.
不可編輯自己的帖子.
不可刪除自己的帖子.
不可發起投票調查.
不可在投票調查中投票.
不可上傳附件.
不可不經審核直接發帖.