web-dev-qa-db-ja.com

/ homeが予想の2倍になるのはなぜですか?

私は今日、ディスクの使用状況をチェックし、次のコマンドを実行しました(Sudoを使用したため、「アクセス権が拒否されました」というメッセージが表示されませんでした)

$ du -hs /home
26G     /home

$ ls -la /home
total 24
drwxr-xr-x  4 root  root   4096 Dec 27  2017 .
drwxr-xr-x 25 root  root   4096 Oct  1 17:39 ..
drwxrwxr-x  3 root  root   4096 Dec 27  2017 .ecryptfs
drwx------ 53 paper paper 12288 Oct  6 14:38 paper`

$ du -hs /home/*
13G    /paper

/ homeディレクトリが、/ homeにある唯一のように見える、ユーザーディレクトリの2倍のサイズであるのはなぜですか?

6
Nick Reed

同じシェルでshopt dotglobを実行してみてください。

dotglobがオフになっている可能性があります。これにより、*展開(グロビング)に、.で始まる名前のファイルとディレクトリが含まれなくなります(特別なディレクトリエントリ...を含みますが、これらは絶対に含まれません。ワイルドカード展開で、rm -rf ./*./..を含むように展開された場合に発生する混乱を想像してください。

したがって、du -hs /homeを実行すると、そのディレクトリ内のすべてがカウントされますが、du -hs /home/*du -hs /home/paperのみに展開されるため、後者のディレクトリのみがカウントされます。

おそらく/home/.ecryptfsには暗号化されたデータが含まれているため、復号化されたデータとほぼ同じサイズになることは理にかなっています。したがって、ファイルは効果的に2回カウントされますが、親ディレクトリでduをポイントした場合のみです。

shopt -s dotglobを使用してそのShellセッションでdotglob設定をオンにしてからSudo du -hs /home/*をもう一度実行すると、Sudo du -hs /homeを実行した場合と同じサイズで表示されることがよくあります。

これを示す別の方法は、コマンドの先頭にechoを置くことです。したがって、たとえば、du -hs /home/*の代わりに、echo du -hs /home/*を試すことができます。これは、*がシェルによってどのように展開されるかを示します。


余談ですがSudoからすべてを習慣的に実行することはお勧めしません。必要な場合はSudoを使用しますが、そうでない場合は使用しません。たとえば、スーパーユーザーとしてls -la /homeを実行する必要はありません。ディレクトリ/homeは世界中で読み取り可能です。

21
a CVn