一般的な質問
同じ内容の2つのディレクトリが異なるデバイスに保存されているとします。ディレクトリのサイズを計算し、常にまったく同じ数を取得する方法はありますか?つまり、保存場所に関係なく、ディレクトリの「実際のサイズ」はありますか?
実際のケース
私は2つのストレージデバイス間でディレクトリを転送するために使用しますrsync -ahP /dir1/ /dir2/
。転送が正常に完了した後du -s --apparent-size
。一部のディレクトリでは、両方のデバイスでまったく同じ番号を取得しましたが、すべてではありません。
特定の問題
rsync
ディレクトリの正確なコピーを作成せずに選択したオプションを使用できますか?それでは、正確なコピーを取得する方法はありますか?
ストレージデバイスに関係なく使用されるコマンドは、du
ディレクトリの「実際のサイズ」を提供しません。それでは、そのような寸法を計算する方法はありますか?
答え1
du
GNUのオプションには、以下を含むすべての種類のファイルの見かけのサイズ(報告されているように)も含まれます--apparent-size
。lstat()
一般ファイル、装備、シンボリックリンク、先入選出、目次。他の多くの実装と同様に、GNUはdu
同じファイルを複数回カウントしたくありません(たとえば、同じファイルへの複数のハードリンクがある場合など)。
-H
ここでは にオプションを渡さないため、rsync
ハードリンクは維持されないため、ソースにdu
ハードリンクが存在する場合、除外されたアカウントの重複により差異が発生します。
タイプファイルの見かけのサイズ目次実際のサイズを示します。データ:ファイル名のリストとそのファイルが見つかる場所に関する情報。リストの形式とサイズは、ファイルシステムの種類、構成方法、およびディレクトリを埋める方法によって異なります。
デバイスファイル、fifo、データを送信しないソケットの場合、rsync
一部のシステム(Linuxなど)は常に見かけの大きさで0を返し、一部のシステムは読み取り可能なデータ量を返します(ブロックの場合など)。デバイスファイル)、これは対応するリポジトリのサイズである可能性があります)。
したがって、ここでできる最善の方法は、見かけのサイズの合計を計算することです。定期的なそしてシンボリックリンクファイルはあるシステムから別のシステムに一貫しています。
GNUを使用してこれを行うことができますfind
。
find . -type f,l -printf '%s\n' | awk '{s+=$0}; END{print s}'
送信元と送信先で同じ番号が見つかった場合、両方が正常にrsync
送信された可能性が高くなります。データ(一般ファイルの内容とシンボリックリンク(ターゲットパス))。拡張属性、ACL(オプションを-X
渡さないため、-A
両方のメタデータは保存されません)、ファイル名、空のファイルなど、すべてのメタデータを正常に転送できない可能性があります。
ディレクトリ内のデータサイズの一貫した表現として(エンコードの問題がないと仮定1)find . | wc -c
(すべてのファイルパスの長さの合計+ 1)を使用できます。
(dry-run)と(verbose)を使用して同じrsync
コマンドを再実行して、欠落しているコンテンツを確認したり、ソースの代わりにターゲットからファイルを確認したりするために1つを追加することもできます。-n
-v
--delete
厳密に言えば、特定の非ASCII文字に対する文字エンコーディング変換の場合、特に非UnixまたはmacOSファイルシステムが関係する場合など、ファイル名にいくつかの変換が行われると、シンボリックリンクサイズが変わる可能性があります。
答え2
Rsyncやその他のツールはディレクトリを正確にコピーしません。スパースファイルを正確にコピーしたり、コピーしないことがあります。これはいいえ一般的に心配する必要があります。
次のbashの例を考えてみましょう。
mkdir -p /tmp/demo/a
cd /tmp/demo/a
touch {1..10000}
ls -ld
これにより、10,000個のファイルが作成され、そのファイルが保存されているディレクトリのサイズが一覧表示されます。私のシステムでは、155648バイトのディレクトリサイズを取得します。 9,000個を取り出して寸法を再確認してください。
rm ????
ls -ld
私のディレクトリサイズは155648バイトで同じままです。今コピーを作成します。ここではそれを使用していますが、コピーされたファイルでも別のものでもかまいませんcp
。rsync
cpio
cd ..
cp -r a b
ls -l
私にとって、b
ディレクトリは135,168バイト未満の20,480バイトにすぎません。これはa
、ディレクトリに削除されたファイル3141のエントリを収容するためのスペースがありますが、b
そのスペースが割り当てられていないためです。