rm -rはどのように再帰的に削除しますか?何の順番で?


30

操作の順序はありrmますか?私rmは大きなディレクトリでパフォーマンスを行い、削除された可能性のあるものを確認する場所を知りたいと思っています。rm最初にファイル、次にディレクトリで機能しますか?または、iノードテーブルの情報に基づいていますか?

仕様:GNU coreutils 8.22システムのrm:beagleboneblackファイルシステムで動作するArch Linuxは、USB 2.0を使用する外部Seagate HDD(ext4)でした。

バックストーリー:

私はいくつかのディレクトリのクリーンアップを実行していた

cp -r A/ B/ C/ Dest/

無意識のうちに、私はそれをフォローアップしました

rm -r A/ B/ C/ Dest/

単純に実行するつもりだったとき

rm -r A/ B/ C/

私はこれを捕まえて、長すぎる時間が経過する前にCtrl+ Cを押しました。具体的には、timeコマンドをrm&と組み合わせて使用していたため、3秒未満cpでした。私は入って、Dest/それが存在しないと期待して調べましたが、それが全体であり、影響を受けていないように見えました。A/ B/ C/非常に小さいので、これは少し驚くべきことです。合計で100〜200 MBです。Dest/ただし、1TBほどです。実行するlson Dest /をと、アルファベットの両端にファイルとディレクトリの両方が存在することが示されました(例AFile.txt.... .... Zoo.txt)。

運が良かったのでキャンセルしました rmDest /ディレクトリに大混乱を引き起こす前にか?であるrmことが遅い(ありがたい!)本当に?

そうでない場合、どのように rm失われた可能性があるものを推測できるように再帰的に削除しますか?

私は失ったかもしれないものを回復することを本当に期待していません。


回答:


34

rm -r各引数を順番に処理します。引数がディレクトリの場合、ディレクトリをリストします(opendirおよびreaddir関数または同等の方法で)各エントリを順番に処理します。エントリがディレクトリの場合、そのエントリを再帰的に探索します。

これは、他のアプリケーションがディレクトリを再帰的にトラバースするために使用することをまったく同じ方法である- findls -Rfなど

トラバーサルの順序は予測できません。ほとんどのファイルシステムでは、ディレクトリでファイルが追加、削除、または名前変更されない限り、順序は再現可能です(理論的には順序は完全にランダムであり、毎回変わる可能性がありますが、それが発生するファイルシステムは考えられません)。いくつかのファイルシステムでは、一般にファイル名またはファイルが作成された順序、または両方の組み合わせから順序を推測できますが、ファイルシステムの詳細を知る必要があります。ドライバーのバージョン。トラバーサルの順序は、信頼できるものではありません。

lsまたはecho *、名前の辞書式順序でファイルをソートすることに注意してください。findそしてls -fソートしないください。

信頼できる1つのことは、引数が順番に処理されることです。したがって、C/まだ部分的に存在していれば、それDest/は手付かずだったということです。C/削除されている場合はDest/、ディレクトリの変更時間を確認し、それらC/が削除された時間またはコピーが終了した時間と比較することにより、ファイルが削除された場所を知ることができます。削除される最初のファイルDest/は、その最初のエントリDest/rmたまたまディレクトリであったかどうかに応じて、階層内の直接または階層内のどこかにある可能性があります。

の速度rmは、主に削除するファイルの数の問題です。削除時間に顕著な影響を与えるには、非常に大きなファイルが必要です。作業の大部分は、各ディレクトリエントリを順番に削除しています。ファイルのデータは消去されません。ファイルのコンテンツを消去するには、使用していたブロックを空きとしてマークするだけで済み、比較的高速です。


2
-fオプションはlsに相当するものとして文書化されており-aU-aすべてのファイルをリストし、-Uソートされていないことを意味しています。私は漠然とのバージョン遭遇思い出すlsものでは-fなく、(私はそれが何か他のものであると定義されていたと思う)の仕事をしませんでした-aUでした。
Gマンは「Reinstate Monica」と言います

2
@ G-Man POSIX-fXSI拡張として)定義します; 実際、ソートされていない他の効果があります。それはV7に戻るので、不思議なことに、BusyBoxとは別に、それなしで実装を見つけるのは難しいでしょう。-U並べ替えられていないだけがGNUの機能であるため、他のどこにも存在するとは思わない。
ジル 'SO-悪であるのをやめる'


@Timいいえls -U。ディレクトリで実行してテストできます。これは、rm -rそのディレクトリで機能する順序と同じです。ファイルを追加または削除すると、他のファイルの順序が変わる可能性があることに注意してください。
ジル 'SO-悪であるのをやめる'

ありがとう。(1)「ファイルを追加または削除すると、他のファイルの順序が変更される可能性があります。」ので、誤って部分的に削除した後ls -U、生存しているディレクトリが変更されていないかどうかを確認するのに役立ちませんか?(2)-Uは「ディレクトリ順にエントリをリストする」ことを意味します。-Uは、ディレクトリ内のディレクトリエントリの順序を意味しますか?
ティム

5

Gillesが言うように、一般的にディレクトリ内の削除の順序を予測することはできません。トップレベルのディレクトリがコマンドラインでの順序で処理されることだけです。

ただし、UNIXではディレクトリが空の場合にのみディレクトリの削除が許可されるため、ディレクトリ階層が下から上に削除されることも保証されます。そのため、ディレクトリを削除するには、まずその中のすべてを削除する必要があります。サブディレクトリが含まれている場合、最初にそのコンテンツを削除する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.