Bash

檢查下載完成的純bash

  • May 5, 2016

簡短的故事是,我可能需要一個簡單的 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. 它可能具有隻有超級使用者才能使用的選項,但這不是其中之一。

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