du
複製している USB ドライブに書き込まれるデータの量を継続的に監視するために使用しています。
ソース ドライブとターゲット ドライブのディスク使用量を比較し、コピーの進行状況をユーザーに表示します。
問題は、du
システム キャッシュにはまだ大量のデータが残っており、ドライブの LED が点滅していて、ドライブを取り外す準備ができていないにもかかわらず、ターゲット ドライブに 100% のデータが存在すると報告されることです。
ユーザーがターゲット ドライブを削除できるようにする前に、データが実際に存在することを確認するために、、を順番に実行します。ただしrsync
、進行状況を監視することはできません。そのため、ドライブが実際に同期されるずっと前に、ユーザーには 100% が表示されます。sync
umount
sync
本当に重要なのは「実際の」コピーの進行状況を監視できることです。1 rsync
GB のファイルを 25 秒で完全にコピーするのを見ても意味がありません。そのファイルをドライブにフラッシュするのにさらに 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
ディレクトリ構造を手動で再作成する必要があることです。ファイル属性や変更日を考慮する必要はありません。
、 、を組み合わせて、まずディレクトリ ツリーを再作成し、次にファイルを 1 つずつコピーできると思いますfind
。この方法には欠点があるのでしょうか?mkdir
dd
答え1
これに対処する最善の方法は、直接ファイル出力こうすることで、du
読み取り値がより正確になります。
残念ながら、それだけしかdd
許可されていないため、次の 2 つの問題を回避する必要があります。
dd
ディレクトリをどう扱えばよいかわからないdd
一度にコピーできるファイルは1つだけです
まず、入力ディレクトリと出力ディレクトリを定義しましょう。
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 \;
これによって、ファイルの変更時刻、所有権、その他の属性は保持されませんが、私にとっては問題ありません。