du
コピーしたUSBドライブに書き込まれるデータ量を継続的に監視するために使用します。
ソースドライブとターゲットドライブのディスク使用量を比較し、ユーザーにコピーの進行状況を表示します。
問題は、du
システムキャッシュにまだ多くのデータがあり、ドライブのLEDが点滅し、ドライブが準備されていないことを確認しても、ターゲットドライブにデータが100%存在すると報告することです。削除されました。
私はを実行し、rsync
ユーザーがターゲットドライブを削除する前に、データが実際に存在することを確認しました。ただし、進行状況を監視することはできません。したがって、ユーザーはドライブが実際に同期されるまで状況を100%表示できます。sync
umount
sync
私は「実際の」コピーの進行状況を監視できるようにしたいです。それが本当に重要だからです。rsync
1GBファイルが25秒以内に完全にコピーされるのを見るのは無駄で、sync
ドライブに更新されるまでさらに5分待たなければなりません(私は少し誇張していましたが、どういう意味ですか?)
以下は、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つずつコピーできると思いました。気になります。このアプローチに欠点はありますか?
答え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 \;
これはファイルの変更時間、所有権、その他の属性を保存しませんが、私にとっては重要ではありません。