'find -empty -delete' は空でないディレクトリを削除します。

'find -empty -delete' は空でないディレクトリを削除します。

次のディレクトリ構造を作成すると:

mkdir -p dir1/dir2/dir3/dir4

次に実行すると、find dir1次のものが返されます。

dir1
dir1/dir2
dir1/dir2/dir3
dir1/dir2/dir3/dir4

実行すると、find dir1 -empty次のように返されます。

dir1/dir2/dir3/dir4

dir4のみが空であることを示します。

ただし、実行すると、find dir1 -empty -delete4つのディレクトリがすべてすぐに削除されます。

dir4のみを削除して次回コマンドを実行すると、dir3のみが削除されるようになります。なぜこれが起こり、dir4のみを削除するにはどうすればよいですかfind

ベストアンサー1

-delete暗黙的-depthまたは深度優先の反復に従って、最初に見て空であることを確認して削除し、次に見て(現在)空であることを確認して削除しますfinddir1/dir2/dir3/dir4dir1/dir2/dir3

GNUのマニュアルページ説明する:

-depth
各ディレクトリの内容は、ディレクトリ自体を処理する前に処理されます。アクション-deleteもヒントを与えます-depth

彼らは、いくつかのファイルを削除してから同時に空にした場合(サブツリー全体を再帰的に削除せずに)、そのファイルを含むディレクトリを削除できる方が役に立つと思ったかもしれません-deletefind一致するすべてのファイルとディレクトリが消えます。あるいは、他の方法で見ると(ここで好きなように)、木の葉だけを取り除くことは冪等ではありません。誤ってコマンドを再実行すると、ディレクトリツリーから他のレベルが削除されます。

いずれの場合でも、デフォルトモードを維持するためにfind実行し、現在削除されているディレクトリに入らないように追加できます。また、ここにデバッグ機能を追加して、何が削除されるのかを見てみましょう。rmdir-prune-print

$ mkdir -p dir1/dir2/dir3/dir4
$ find -type d -empty -exec rmdir {} \; -prune -print
./dir1/dir2/dir3/dir4

残りは次のとおりです。

$ find
.
./dir1
./dir1/dir2
./dir1/dir2/dir3

(ここでrmdir失敗すると、ジョブ-execはfalseと評価され、andジョブは-prune実行-printされません。したがって、stdoutへの出力には実際に削除された内容のみを含める必要があります。これとは異なります-exec rmdir {} +。)

もちろん、ここでは空のディレクトリだけを削除すると仮定し、空のファイルも削除するには、まず次のようにします。

find -type f -empty -delete

rmあるいは、ビルドにrmdirファイルとディレクトリの間違った組み合わせが必要です。

find -empty \( -type f -exec rm {} \; -o -type d -exec rmdir {} \; -prune \) -print

rm -rf明らかに可能ですが、より危険です。)

おすすめ記事