次のディレクトリ構造を作成すると:
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 -delete
4つのディレクトリがすべてすぐに削除されます。
dir4のみを削除して次回コマンドを実行すると、dir3のみが削除されるようになります。なぜこれが起こり、dir4のみを削除するにはどうすればよいですかfind
?
ベストアンサー1
-delete
暗黙的-depth
または深度優先の反復に従って、最初に見て空であることを確認して削除し、次に見て(現在)空であることを確認して削除しますfind
。dir1/dir2/dir3/dir4
dir1/dir2/dir3
GNUのマニュアルページ説明する:
-depth
各ディレクトリの内容は、ディレクトリ自体を処理する前に処理されます。アクション-delete
もヒントを与えます-depth
。
彼らは、いくつかのファイルを削除してから同時に空にした場合(サブツリー全体を再帰的に削除せずに)、そのファイルを含むディレクトリを削除できる方が役に立つと思ったかもしれません-delete
。find
一致するすべてのファイルとディレクトリが消えます。あるいは、他の方法で見ると(ここで好きなように)、木の葉だけを取り除くことは冪等ではありません。誤ってコマンドを再実行すると、ディレクトリツリーから他のレベルが削除されます。
いずれの場合でも、デフォルトモードを維持するために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
明らかに可能ですが、より危険です。)