ディレクトリ内のすべてのファイルとサブフォルダを削除する最速の方法は何ですか? [コピー]

ディレクトリ内のすべてのファイルとサブフォルダを削除する最速の方法は何ですか? [コピー]

プログラムは入れ子になったサブフォルダをたくさん作成します。コマンドを使ってrm -fr *すべて削除してみました。しかし、非常に遅いです。すばやく削除する方法があるかどうか疑問に思います。

答え1

そのディレクトリから削除する最速の方法は、そのディレクトリから削除してからバックグラウンドで削除することです。

mkdir ../.tmp_to_remove
mv -- * ../.tmp_to_remove
rm -rf ../.tmp_to_remove &

これは、現在ディレクトリがマウントされている一部のパーティションの最上位レベル(つまり../.tmp_to_remove同じファイルシステム)にないと仮定します。

について質問がある場合--mv-

上記のコードはサブディレクトリを繰り返し処理する必要がないため、1秒以内に現在のディレクトリからファイルを削除します。実際には、ファイルシステムからツリーを削除するのに時間がかかりますが、邪魔にならないので、実際の効率はそれほど重要ではありません。

答え2

rsync驚くほど速くて簡単です。まず、空のディレクトリを作成する必要があります。

mkdir 空のディレクトリ
rsync -a --空のディレクトリ/ディレクトリ/削除

yourdirectory/ファイルを削除するディレクトリです。

答え3

最も速いのは、rm -rf dirname140520個のファイルと9699個のディレクトリを含むRedHat6.4で、ext3ファイルシステムのスナップショットマウントポイントを使用しました。速度が遅い場合は、rm -rf *おそらく最上位のディレクトリエントリに次のものがあるためです。場所ファイルがあり、シェルが拡張されているため、追加の*readdirとソートが必要です。ディレクトリに変更して実行しますrm -rf dirname/

Method                    Real time    Sys time  Variance (+/-)
find dir -delete          0m8.108s     0m3.668s  0.055s
rm -rf dir                0m7.956s     0m3.640s  0.081s
rsync -delete empty/ dir/ 0m8.305s     0m3.918s  0.029s

メモ:

  • rsync バージョン: 3.0.6
  • rm/coreutils バージョン: 8.4-19
  • 検索/findutils バージョン: 4.4.2-6

答え4

1つの問題rm -rf *またはより正確な問題rm -rf -- *は、シェルが最初に現在のディレクトリにあるすべての(隠されていない)ファイルをリストし、それらをソートしてに渡すことですrm。これは、現在のディレクトリにあるファイルのリストが大きいほど増加します。不要で追加のオーバーヘッドが発生し、ファイルのリストが大きすぎると失敗する可能性があります。

通常、これを行いますrm -rf .(隠しファイルを削除する利点もあります)。ただし、ほとんどのrm実装(すべてのPOSIX準拠の実装を含む)はこれを拒否します。その理由は、一部のシェル(すべてのPOSIXシェルを含む)にglob拡張に含まれて.*いる機能が含まれているためです。これは、現在のディレクトリと親ディレクトリが削除されることを意味するため、これらのシェルの誤った機能を解決するために修正されました。...rm -rf .*rm

一部のシェルpdksh(および他のForsythシェル派生物)には、zshこれらのfish誤った機能はありません。に含まれているか使用されていないため、有効にできる組み込み機能がzshあります。したがって、次のことができます。rmautoload zsh/fileszsh.*...rm -rf .zsh

zmodload zsh/files
rm -rf .

Linuxでは、次のことができます。

rm -rf /proc/self/cwd/

現在のディレクトリを消去するか、次の手順を実行します。

rm -rf /dev/fd/3/ 3< some/dir

すべてのディレクトリを消去します。

(次の内容に注意してください/

GNUシステムでは、次のことができます。

find . -delete

現在、ディレクトリにいくつかのエントリがあり、ほとんどのファイルがサブディレクトリにある場合、これは大きな違いはなく、rm -rf -- *おそらく取得できる最速の速度になります。これは、すべてのディレクトリの内容を読み取って各エントリをrm -rf呼び出すことを意味するため、各ファイルから何かを削除するのは高価であると予想されます。削除されたファイルのinode、ファイルを含むディレクトリ、一部のファイルシステムマッピング、またはその他の利用可能な領域を変更する必要があるため、それ自体は非常に費用がかかります。unlink()unlink()

rmそしてfind(少なくともGNU実装では)、すでに各ディレクトリのinode番号に基づいてファイルのリストをソートしています。これは、修正される連続(または互いに近い)inodeの数を減らすので、ext4ファイルシステムのパフォーマンスに大きな違いを生む可能性があります。順番に。

rsyncファイルを名前でソートします。名前の順序が inum の順序と一致しない限り、(ソートされたファイル名のリストからファイルが生成される場合など)、パフォーマンスが大幅に低下する可能性があります。

場合によっては、より高速な理由の1つは、競合状態を回避するための安全対策を講じていないようrsyncです。rmfind

高度な最適化:

ディレクトリツリーの最大深さがわかっている場合は、それを次に渡すことができますfind

find . -maxdepth 3 -delete

これにより、findディレクトリの内容を深さ3まで読み取ろうとする必要がなくなります。


¹ globskipdotsbash 5.2+のオプションも参照してください

関連情報