
特定のフォルダー内には多数のサブフォルダーがあり、その中には多数の小さなファイルが含まれています。これらはプログラムによって作成されるため、フォルダー内にいくつのファイルがあるかはわかりません。
私はこれらのサブフォルダとファイルをすべて削除することにしたので、次のコマンドを発行しました。
rm -rf foldername/
ただし、rm コマンドの実行には非常に時間がかかりますが、すべてのファイルのリンクを解除する必要があるため、これはまったく正常な動作であると考えられます。
しかし、コマンドを発行してこのフォルダのサイズが縮小されているかどうかを確認することにしました。
du -sh foldername/
しかし、上記のコマンドを実行すると、次のようなエラーが発生します。
du: cannot access `foldername/file': No such file or directory
このエラーはなぜ発生するのでしょうか?
答え1
du
は、ディレクトリ ツリーを再帰的に走査する他のコマンドと同様に、次のように動作します。
- パス¹を介してアクセスされたファイルに関する情報を読み取ります。の場合
du
、システムコールstat
ファイルの種類 (特にディレクトリかどうか) とサイズを指定します。最初は、名前はコマンド ラインから取得されます。 - ファイルがディレクトリの場合、開けるそれと読むファイル名のリスト。
- ディレクトリ内のファイル名ごとに、ファイル パス ( ) を構築し、ステップ 1 から再帰的に処理します。このステップは、前のステップと部分的に並行して実行される場合があります (実装によって異なります)。
DIRECTORY/ENTRY_NAME
rm
は実行され、ファイルを 1 つずつ削除しています。 は、du
ステップ 2 でファイル名を読み取りますが、ステップ 3 で処理するまでに、そのファイルrm
名は削除されています。 このエラーが発生するかどうか、また何回発生するかは、rm
との相対速度によって決まりdu
、ほとんど予測できません。
¹ ファイルに直接アクセスする方法は、パス (相対または絶対のディレクトリ情報を含む) または (ファイルが開いている場合) 記述子による 2 つだけです。
答え2
duコマンドのエラーは無視してください
に従ってこれリンク、du
単に言及するだけでエラーを無視することができます、
du 2> >(grep -v '^du: cannot \(access\|read\)' >&2)
しかし、私がもっと具体的に知りたいのは、ファイルの削除で何が起こっているのかということです。特に、コマンドがサイズを指定できない理由と、コマンドがファイルのリンクを解除したdu
ときにエラーが報告される理由を知りたいのです。rm
これについては、これリンク。ここで何が起こったのかを確認するために、言い換えているだけです。
- コマンド
rm
によりファイルのリンクが解除されました。(つまり、親ディレクトリからファイル名エントリが削除されます)。 - ただし、ファイル名が関連付けられていないにもかかわらず、ファイル ハンドルは有効なままです。これは、
du
コマンドがファイルまたはディレクトリを認識しないことを報告している場所です。
検証
ファイルが実際にリンクされていないことを確認するために、さらに調査を行いました。
pid
コマンドを使用して rm プロセスを取得しましたps
。次に、以下のコマンドを発行して、ファイルがまだ使用可能かどうかを確認します。
lsof +L | grep 11771
上記のコマンドを実行すると、以下の出力が得られました。
rm 11771 root 4r DIR 8,17 175882240 2 47333397 /foldername/filename
したがって、上記の出力のとおり、ファイルはリンク解除されています。
rm
コマンドはまだ実行中なので、du
コマンドはエラーを報告します。