
特定のユーザーが所有するすべてのファイルの合計サイズを調べようとしていました。
そうしてみると、異なるコマンドを実行するとサイズが異なります。
特定のユーザーが所有するすべてのファイルの合計サイズを確認するには、どのコマンドが正しいですか?
$ find . -type f -user silviya|ls -lh|head -1
total 68K
$ find . -type f -user agalya|wc -c
284
$ find . -type f -user agalya|du -sk
120 .
この変化の理由は何でしょうか?
答え1
で:
find . -type f -user silviya|ls -lh|head -1
find
の出力を にパイプしていますls
が、ls
入力は読み込まれません。引数としてリストするファイルのリストを受け取ります。ここでのように引数がない場合、現在のディレクトリにある隠しファイル以外のファイルがリストされます。したがって、ここでは、現在のディレクトリにある隠しファイル以外のすべてのファイル (すべてのタイプ) のディスク使用量が取得されます (特定のファイルのサイズは、そのハードリンクごとにカウントされます)。
で:
find . -type f -user agalya|wc -c
の出力のバイト数をカウントしているfind
ので、それはファイル パス (および改行区切り文字) のサイズであり、ディスク使用量やファイル サイズではありません。
で:
find . -type f -user agalya|du -sk
と同様にls
、du
は入力からではなく引数としてファイル リストを受け取ります。したがって、ここでは、現在のディレクトリ内のすべてのファイルとディレクトリのディスク使用量を (再帰的に) 取得します。
GNU ユーティリティを使用して、が所有するすべての通常ファイルのディスク使用量を取得するにはagalya
、次のようにします。
find . -type f -user agalya -print0 | du -hc --files0-from=- | tail -n 1
--files0-from
標準入力からファイルリストを取得するように指示します(ここでは で表されます) du
(GNUのみ) 。累積サイズを示します (同じファイルのハードリンクは 1 回だけカウントされることに注意してください)。du
-
-c
ファイルを取得するには見かけ上ディスク使用量ではなくサイズをカウントするには、--apparent-size
オプションを追加しますdu
(これも GNU 固有)。-l
ハードリンクを複数回カウントするには、オプションを追加します (これも GNU 固有)。
答え2
コマンド #1 は、ファイルの内容の「有効な」バイトの合計サイズを示します。
コマンド #3 は、ファイルを保持するために使用されたディスク領域を示します。ディスクは、複数のファイルで共有できないブロック (多くの場合 4 KB 長) に分割されます。したがって、1 から 4096 KB までの任意のサイズのファイルは、4 KB のディスク領域を使用します (例) [これは簡略化されています。ext などの一部の FS タイプでは、非常に小さなファイルは、データ ブロックをまったく使用せずに、ファイル テーブル自体に保存できます。]
コマンド2は、ファイル名(コマンドの出力のサイズfind
。)