このコマンドは、子ディレクトリが削除された後に親ディレクトリも削除されることをどのように認識しますか?

このコマンドは、子ディレクトリが削除された後に親ディレクトリも削除されることをどのように認識しますか?

~からhttps://unix.stackexchange.com/a/24163/167166

find . -type d -depth -empty -exec rmdir "{}" \;

まず、最初の空のディレクトリが見つかるまでディレクトリツリーをドリルダウンしてから削除します。したがって、親ディレクトリを空にして削除するなどの操作を実行します。これはあなたが望む効果をもたらすでしょう。 (おそらく週に10回程度この作業を行うので、これが正しいと確信しています。) :-)

子ディレクトリを削除した後に親ディレクトリを削除する方法は?

ありがとうございます。

答え1

~からfindマンページ:

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

そして

find . -type d -depth -empty -exec rmdir "{}" \;

find現在のディレクトリから始めて、その中に含まれているすべてのファイルとディレクトリ(およびサブディレクトリなど)を見つけ、ディレクトリの内容から始めて、親ディレクトリを処理しながら各ディレクトリを処理します。次のツリーを想像してください。

.
├── a
│   ├── c
│   └── d
│       └── e
└── b

find . -depth処理の順序を表示します。

./a/c
./a/d/e
./a/d
./a
./b
.

ご覧のとおり、子は親の前にリストされています。より複雑なfindコマンドでは、その操作は親の前に子に適用されます。空のリーフディレクトリが最初に処理され、空の場合、親は削除されます。もし彼ら空のまま(空の子が削除されたために可能性があります)も削除され、現在のディレクトリに戻ります。

たとえば、省略すると、-depthファイルは列挙された順序で処理されます。find

.
./a
./a/c
./a/d
./a/d/e
./b

したがって.、まず処理されて空ではないので、そのままにしておきます。まあa、同じです。その後、a/c;は空のため削除されます。そのままa/d保持してa/d/e取り除きますb。すでに処理されているディレクトリは再び訪問されないため、削除したいfind場合でもそのまま残りますaa/d

関連情報