私は今日、ディスクの使用状況をチェックし、次のコマンドを実行しました(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倍のサイズであるのはなぜですか?
同じシェルで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
は世界中で読み取り可能です。