これは非常にシンプルなワンライナーです:
find Parent -empty -delete
それはかなり自明です。確認したところ、Parent/Child1 が正常に削除されたことに驚きました。通常、-depth
を指定しない限り、子より先に親を処理することが期待されます。 .
これは -delete
であるため機能します -depth
を意味します . GNU find マニュアルを参照してください:
-delete
ファイルを削除します。削除が成功した場合は true。削除に失敗した場合は、エラー メッセージが発行されます。 -delete が失敗した場合、find の終了ステータスはゼロ以外になります (最終的に終了するとき)。 -delete を使用すると、-depth オプションが自動的にオンになります。
これらの機能は Posix 標準の一部ではありませんが、多くの Linux ディストリビューションに含まれている可能性が高いことに注意してください。 -empty
をサポートしていない Busybox に基づいているため、Alpine Linux などの小規模なものでは特定の問題が発生する可能性があります。 .
非標準の -empty
を含むその他のシステム および -delete
BSD と OSX は含まれますが、明らかに AIX は含まれません。
これが 2 つのコマンドによる解決策です
空のファイルを削除
find Parent/ -type f -size 0 -delete
すべてを削除してみてください ディレクトリ
find Parent/ -type d -depth -print0 | xargs -0 rmdir 2>/dev/null
NB rmdir
空でないディレクトリは削除できないため、安全に実行できますが、隠しているエラーが発生します
上記と同様ですが、無視されるエラー メッセージについてもう少し具体的に説明します。ディストリビューションによってメッセージが異なる場合は、修正が必要になる場合があります。
find Parent/ -type d -depth -print0 | xargs -0 rmdir 2>&1 \
| grep -iv "Directory not empty$"
fd
でこれを行うこともできます ツール:
fd -t e -x rm -r
https://github.com/sharkdp/fd