rsync 自 2 小時以來未修改的文件?
我在遠端伺服器上有一個應用程序,它大約每 2 小時生成一次新的二進製文件。每 6 分鐘,如果有新數據,文件就會更新。它們在 19 附加後關閉,這意味著如果在每個新的 6 分鐘之間有新數據,它們將在 1 小時 54 分鐘後關閉。
它們是鑲木地板文件:
- parquet 文件可以附加到它們沒有關閉,這就是我的應用程序所做的。
- parquet 文件在關閉之前無法打開
文件名採用以下形式。最後一位是創建文件時的時間戳。之後不會更新此時間戳。
my-data-1602915797.parquet my-data-1609890860.parquet my-other-d-1609990998.parquet my-other-d-1610000010.parquet
一旦完整的文件被寫入,並且一旦它們被安全地複製到本地(在我的 8To 本地硬碟上),我就必須從遠端刪除它們(遠端只有 160Go 硬碟)該應用程序每人產生 4 到 5Go 的數據天。
我計劃每月啟動一次此文件傳輸。
所以,我只想轉移那些關閉的。要選擇它們,我可以使用 ssh。
# IP address is a dummy address ;) ssh root@180.18.17.91 "find /root/my_data -name *.parquet -maxdepth 1 -type f -mmin +180"
然後將其通過管道傳輸到
rsync
.但是,我可以發現這個執行緒,據說可以通過使用
rsync -a
.查看 rsync 手冊頁,我無法發現此參數如何滿足此需求。求大神幫忙理解一下?
感謝您的任何回饋,非常感謝。
您可以
rsync
按照描述的方式複製文件,並在成功複製後將其刪除:rsync --dry-run -avz --remove-source-files root@180.18.17.91:'$(find /root/my_data -maxdepth 1 -name "*.parquet" -type f -mmin +30)' /my/destination
請注意,
- 我使用單引號而不是雙引號來包圍評估的命令
$( find ... )
,以便它在遠端伺服器而不是本地伺服器的上下文中執行- 我已經引用
*.parquet
阻止外殼嘗試將其與您的一個(或多個)鑲木地板文件匹配- 我已將延遲從上次更新後的 180 分鐘減少到僅 30 分鐘(你說最新的文件每六分鐘更新一次,所以 30 已經足夠了)
- 我曾經
-z
通過網路連接壓縮數據流。即使使用預壓縮的數據,這也會有所幫助- 該目錄
/my/destination
是將鑲木地板文件移動到的本地目錄我強烈建議您嘗試
--dry-run
啟用以檢查會發生什麼,然後在您對預期結果感到滿意時刪除該參數
--progress
如果您想實時觀看,請添加以查看每個文件的傳輸進度。不要在這裡使用-P
或--partial
。我應該指出,沒有簡單的方法來辨識已“關閉”的文件。您可以編寫一些程式碼來使用
lsof
,或者可能來自inotify
家庭的東西。我在這裡所做的是依靠應用程序在上次更新後的 30 分鐘內寫入目前文件,以便作業系統可以相應地自動更新文件修改時間。如果您的應用程序擺弄文件修改時間(元數據,而不是文件名),那麼這將中斷。最乾淨的解決方案是修改您的應用程序以創建其文件
*.parquet.tmp
,然後*.parquet
在完成寫入它們時將它們重命名為相應的。(這將允許您保證只有*parquet
文件已完成,因此適合複製。)但我很感激這可能是不可能的。