檢查下載完成的純bash
簡短的故事是,我可能需要一個簡單的 bash 循環,它定期檢查給定文件的大小自上次檢查以來是否發生了變化。
長話短說,我將使用 Firefox下載文件my_file.txt 。我想在下載完成後執行一個命令。Firefox 似乎沒有提供我可以使用的 dbus 呼叫。存在一些具有上述功能的附加組件,但我需要一個相當可靠的解決方案。所以我想我可以執行一個 bash 腳本來定期檢查my_file.txt的大小是否隨時間變化,或者已經穩定。該文件是一個大小 <=5mb 的文本文件,將在本地下載,因此它非常可靠並且下載應該線性執行(沒有斷開連接、伺服器問題等)。
你能幫我寫這麼簡單的 bash 腳本嗎?探測文件的頻率似乎真的是使事情有效工作的關鍵。就像我說的,它是一個 <=5mb 的文本文件,但可以小至 10kb,駐留在 SSD 驅動器上。
另外,也許有更好的方法來實現這一點?就像我說的,我需要一個可靠的解決方案,它可以在 Linux 中執行,並且依賴最少。也許是下載管理器?或者任何文件監控守護程序?或者為此提供文件系統 API?或者使用訪問時間而不是大小?
如果您只想等到文件未更改,則類似
size=0 size2=$(stat --printf=%s $filename) while [ $size != $size2 ] do sleep 5 size=$size2 size2=$(stat --printf=%s $filename) done
如果您能夠編寫一些 C 語言,那麼使用 inotify(7) 呼叫集可能會有所幫助;您可以在 CLOSE 事件上觸發操作。
假設唯一打開文件的是正在下載的程序,命令
/usr/sbin/lsof path/to/your/file | wc -l
如果文件仍然打開,則應返回 2,如果沒有人打開,則應返回 0。
第二,因為第一行是列標籤列表,第二行是文件的狀態行。
下載完成後,任何人都不應打開該文件。
您可以在投票中使用該結果。
您需要完整路徑,
lsof
因為它通常是管理員命令,因此位於/usr/sbin
. 它可能具有隻有超級使用者才能使用的選項,但這不是其中之一。