duはファイルにアクセスできません。そのファイルやディレクトリはありません。エラー

duはファイルにアクセスできません。そのファイルやディレクトリはありません。エラー

特定のフォルダ内に多くのサブフォルダがあり、これらのサブフォルダにはより小さなファイルがたくさん含まれています。プログラム的に生成されるので、そこにいくつがあるかわかりません。

これらのすべてのサブフォルダとファイルを削除することを決定し、次のコマンドを実行しました。

rm -rf foldername/

しかし、rmコマンドの実行に時間がかかり、すべてのファイルのリンクを解除する必要があるため、完全に正常だと思いました。

しかし、次のコマンドを実行して、このフォルダのサイズが小さくなっていることを確認することにしました。

du -sh foldername/

ただし、上記のコマンドで発生するエラーは次のとおりです。

du: cannot access `foldername/file': No such file or directory

このエラーはなぜ発生しますか?

答え1

duディレクトリツリーを再帰的に巡回するコマンドと同様に、次のように進みます。

  1. そのパスでアクセスされるファイルに関する情報を読み取ります。duシステムコールの場合statファイルの種類(特にディレクトリの場合)とサイズを提供します。元の名前はコマンドラインから続きました。
  2. ファイルがディレクトリの場合開いているそれと読むファイル名のリストです。
  3. ディレクトリ内の各ファイル名に対してファイルパス()を設定し、手順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リンクを解除したときにエラーを報告する理由は疑問です。

これの説明は次のとおりです。これ協会。私はここで何が起こっているのかを見るためにそれを再現しています。

  1. このrmコマンドでファイルへのリンクが解除されました。 (つまり、親ディレクトリからファイル名エントリを削除します。)
  2. ただし、ファイル名が関連付けられていなくても、ファイルハンドルはまだ有効です。ここではdu、コマンドがファイルやディレクトリを表示できないことを報告します。

確認する

私はこれらのファイルが実際にリンクされていないことを確認するためにもう少し調査しました。

pidrmプロセスを使用して取得しましたps。次に、次のコマンドを実行してファイルが引き続き使用可能であることを確認します。

lsof +L | grep 11771

上記のコマンドは、次の出力を提供します。

rm   11771  root  4r DIR  8,17 175882240     2   47333397 /foldername/filename

したがって、上記の出力によると、ファイルのリンクが解除されました。

コマンドrmはまだ実行中であるため、duコマンドはエラーを報告します。

関連情報