我用來du
持續監控寫入複製的 USB 隨身碟的資料量。
我比較來源磁碟機和目標磁碟機的磁碟使用情況並向使用者顯示複製進度。
問題是du
報告目標驅動器上存在 100% 的數據,即使我看到系統快取中仍存在大量數據,驅動器的 LED 正在閃爍,並且驅動器尚未準備好移除。
我依序運行rsync
、sync
並umount
確保資料確實存在,然後再讓使用者刪除目標磁碟機。sync
但是我無法監控進度。因此,在驅動器真正同步之前,用戶將看到 100% 的情況。
我希望能夠監控“真實”複製進度,因為這才是真正重要的 -rsync
在 25 秒內看到完全複製 1 GB 文件是沒有用的,而我必須再等待 5 分鐘才能sync
將其刷新到開車(我有點誇張,但你明白我的意思)。
這是我監視rsync
每個驅動器循環進度的方法:
PROGRESS="$(echo "$(du -s "/MEDIA/TARGET" 2>/dev/null | cut -f 1) / $(du -s "/MEDIA/SOURCE" 2>/dev/null | cut -f 1) " | bc -l)"
$PROGRESS
是 0 到 1 之間的浮點數,表示來源磁碟機使用率和目標磁碟機使用率之間的比率。
我該如何修改它,以便它只考慮已經同步到驅動器的數據,而不僅僅是在系統快取中等待?
編輯:
我發現dd
可以執行省略系統快取的寫入。我做了一個測試,確實以這種方式複製文件可以du
報告實際值,並且我的進度指示最終會準確:
dd if=/media/SOURCE/file of=/media/TARGET/file bs=4M oflag=direct
這使用讀取緩存,但禁用寫入緩存,使進程更容易跟踪,而無需執行過多的讀取。問題是,要使用dd
而不是rsync
我需要手動重新建立目錄結構。我不需要關心文件屬性或修改日期。
find
我想我可以使用,mkdir
和的組合dd
來先重新建立目錄樹,然後逐一複製檔案。我想知道 - 這種方法有什麼缺點嗎?
答案1
看起來處理這個問題的最佳方法是使用直接文件輸出。這樣du
讀數會更準確。
不幸的是只dd
允許這樣做,所以我們需要解決兩個問題:
dd
不知道如何處理目錄dd
一次只能複製一個文件
首先我們定義輸入和輸出目錄:
SOURCE="/media/source-dir"
TARGET="/media/target-dir"
現在讓我們cd
進入來源目錄,以便find
報告我們可以輕鬆操作的相對目錄:
cd "$SOURCE"
將目錄樹從 複製$SOURCE
到$TARGET
find . -type d -exec mkdir -p "$TARGET{}" \;
重複檔案以$SOURCE
忽略$TARGET
寫入快取(但利用讀取快取!)
find . -type f -exec dd if={} of="$TARGET{}" bs=8M oflag=direct \;
這不會保留文件修改時間、所有權和其他屬性 - 但對我來說這沒關係。