特定のフォルダ内に多くのサブフォルダがあり、これらのサブフォルダにはより小さなファイルがたくさん含まれています。プログラム的に生成されるので、そこにいくつがあるかわかりません。
これらのすべてのサブフォルダとファイルを削除することを決定し、次のコマンドを実行しました。
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
コマンドはエラーを報告します。