rm
への操作の順序はありますか ? rm
を実行しました 大きなディレクトリで、何が削除されたのかを確認する場所に興味があります。 rm
を実行しますか 最初にファイル、次にディレクトリで作業しますか?それとも、iノードテーブルの情報に基づいていますか?
仕様:GNU coreutils8.22のrm
システム:beagleboneblackで実行されているArch Linux
で動作しているArchLinuxは、USB2.0を使用する外部SeagateHDD(ext4)でした。
裏話:
ディレクトリのクリーンアップを実行して実行しました
cp -r A/ B/ C/ Dest/
知らず知らずのうちに、私はそれをフォローアップしました
rm -r A/ B/ C/ Dest/
単に演奏するつもりだったとき
rm -r A/ B/ C/
これをキャッチしてCtrlを押しました + C やがて過ぎ去った。具体的には、time
を使用していたため、3秒未満でした。 rm
と組み合わせたコマンド &cp
。入ってDest/
を調べました それが存在しないことを期待していましたが、見よ、それは完全であり、出現しました 影響を受けません。 A/
として、これは少し驚くべきことです B/
C/
かなり小さかった。合計で100〜200MBになる可能性があります。 Dest/
ただし、1TBは恥ずかしがり屋です。 ls
の実行 on Dest /は、アルファベットの両端にファイルとディレクトリの両方があることを示しました(例:AFile.txt
…。 …。 Zoo.txt
。
運が良かったので、rm
をキャンセルしましたか それが私のDest/ディレクトリに大混乱をもたらす前に? rm
です 本当に遅い(ありがたいことに!)?
そうでない場合、rm
はどのように機能しますか 何が失われたのかを推測できるように、再帰的に削除しますか?
失ったものを取り戻すことは本当に期待していません。吹き飛ばされた可能性があるものに興味があります。
承認された回答:
rm -r
それぞれの引数を順番に処理します。引数がディレクトリの場合、ディレクトリが一覧表示されます(opendir
を使用) およびreaddir
関数または同等の方法)、各エントリを順番に操作します。エントリがディレクトリの場合、そのエントリを再帰的に探索します。
これは、他のアプリケーションがディレクトリを再帰的にトラバースするために使用する方法とまったく同じです— find
、ls -Rf
、など。
トラバースの順序は予測できません。ほとんどのファイルシステムでは、ディレクトリ内でファイルが追加、削除、または名前変更されていない限り、順序を再現できます(理論的には、順序は完全にランダムで毎回変更される可能性がありますが、それが発生するファイルシステムは考えられません)。いくつかのファイルシステムでは、順序は通常、ファイル名またはファイルが作成された順序、あるいはその両方の組み合わせから推測できますが、ファイルシステムの詳細を知る必要があり、状況によって異なる場合があります。ドライバーのバージョン。トラバーサルの順序は信頼できるものではありません。
関連:物理セクターサイズ4096 HDDの論理セクターサイズを最適化しますか?
ls
に注意してください またはecho *
名前の辞書式順序でファイルを並べ替えます。 find
およびls -f
並べ替えないでください。
信頼できることの1つは、引数が順番に処理されることです。したがって、C/
まだ部分的にそこにあった、それはDest/
を意味するでしょう 手つかずでした。 C/
の場合 なくなったら、Dest/
でファイルが削除された場所を知ることができます ディレクトリの変更時刻を確認し、それらを時刻C/
と比較します。 削除されたか、コピーが終了した時刻。削除される最初のファイルは、Dest/
に直接あるファイルである可能性があります または、Dest/
の最初のエントリかどうかに応じて、階層のどこか深いところにあります。 そのrm
たまたまトラバースしたのはディレクトリかどうか。
rm
の速度 ほとんどの場合、削除するファイルの数の問題です。削除時間に顕著な影響を与えるには、非常に大きなファイルが必要です。作業の大部分は、各ディレクトリエントリを順番に削除することです。ファイルのデータは消去されません。ファイルのコンテンツを消去するには、使用していたブロックを空きとしてマークするだけで済みます。これは比較的高速です。