~から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
場合でもそのまま残りますa
。a/d